31

I do not want to install a few jars into a Maven repository (both local/remote). In particular I have a few jar files located in

c:\work\projects\myapp\src\main\webapp\WEB-INF\lib\test.jar

c:\work\projects\myapp\src\main\webapp\WEB-INF\lib\test2.jar

How to include them into my project when open/edit with NetBeans?

1
  • 5
    I wish I could destroy, burn, send to hell all these questions promoting using system scoped dependencies. I keep writing against this practice but sadly, it doesn't help... Commented Sep 22, 2010 at 5:06

4 Answers 4

73

Although it works to use the systemPath reference, it is better to create a local repository. And fortunately, it is easy to do.

Creating a local repository holding jars not available in a public repository

NOTE: I use Eclipse, so some of the instructions are specific to Eclipse. Most are easily generalizable.


Assumptions

  • The jar was created by Maven in another project with the following...

    <groupId>com.foo</groupId>
    <artifactId>test</artifactId>
    <version>0.1.1</version>
    <packaging>jar</packaging>
    

In Project (that wants to access the jars)

  • Create repo directory just off the project base directory
  • For each jar to be accessed locally...
    • add directories for each level of the groupID (ex. /repo/com/foo)
    • add jar name (aka artifactId) without the version (ex. /repo/com/foo/test)
    • add directory for the version of the jar (ex. /repo/com/foo/test/0.1.1)
    • put the jar in that directory (ex. /repo/com/foo/test/0.1.1/test-0.1.1.jar)

In pom.xml (for the project that wants to access the jars)

  • Define the local repository

    <repositories>
      <repository>
        <id>data-local</id>
        <name>data</name>
        <url>file://${project.basedir}/repo</url>
      </repository>
    </repositories>
    
  • Add the dependency on the local jar. From our example above, this would be...

    <dependency>
      <groupId>com.foo</groupId>
      <artifactId>test</artifactId>
      <version>0.1.1</version>
    </dependency>
    

Rebuild

  • Rt click pom.xml -> Run as -> Maven build
Sign up to request clarification or add additional context in comments.

6 Comments

What do you need to do if you only want to give access to the jars in a sub module? I followed the instructions, and added the repository definition to my sub module pom, but maven seems to ignore this repository when building.
Damn, my packaging was pom which was not letting it import. Making it jar followed by mvn clean install -U makes it available to add as maven <dependency>.
This is the correct answer; it follows the Maven ideology, and works like a charm.
um, for Maven 3, there are a few more things that have to be done, like renaming jar to include version number, and adding a pom file to each of these directories. luckily someone already wrote about it here gist.github.com/timmolderez/92bea7cc90201cd3273a07cf21d119eb
@hello_earth although with Maven 3 the jar needs the version number as suffix in its name, there is no need for additional pom(s)!
|
28

Have you considered adding those two JARs as system dependencies? e.g.,

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sun.jdk</groupId>
      <artifactId>tools</artifactId>
      <version>1.5.0</version>
      <scope>system</scope>
      <systemPath>${java.home}/../lib/tools.jar</systemPath>
    </dependency>
  </dependencies>
  ...
</project>

Just a word of note, this is NOT recommended and should be used very sparingly, if ever.

6 Comments

@Pascal Thivent: I up-voted your comment despite your statement that I should get a -10. :) I totally agree with you. I wrote my answer under the assumption that @cometta has his/her reasons for using it. Personally, I hate it when someone goes "but you shouldn't do that!" when I ask a question. I'll update my answer to mention that's it's highly unrecommended.
Maybe the last part of my comment was not necessary (note that I actually didn't downvote your answer). At least, it was not a call for punishment but more a scream of frustration :) I will repost a more friendly version.
This is really an evil practice strongly discouraged. Every time someone use this, God kills a Maven developer.
I do not share the fervor with which you do not recommend this practice. In the context of a source-controlled build, lack of access to a local maven repo, and a team project, this is the only sane solution to providing a dependency not available in public repos...
@jfernand - "... this is the only sane solution ...", Actually, it is not the only sane solution. See the other answers.
|
14

In the past, I've done this by creating a "local" repository directory tree in the project itself, and referring to it in the POM by declaring a local repository with a project relative path.

But that is a hack. (Maybe not so hacky - per @Pascal's comment. I'm still a bit of a Maven novice, despite using it for a year or so.)

2 Comments

That's a muuuuuuuuuuuuuuuuuch better solution than the evil system scope hack. People keep using the system scope (and recommending it) without understanding how it hurts... This is depressing.
Nice to hear this worked for you. Could you perhaps update your answer to explain how I could make this technique work for me?
7

None of the other answers worked for me. I had to run a slightly different command...

mvn deploy:deploy-file -Durl=file:///path/to/yourproject/repo/ -Dfile=mylib-1.0.jar -DgroupId=com.example -DartifactId=mylib -Dpackaging=jar -Dversion=1.0

See complete steps in this article: https://devcenter.heroku.com/articles/local-maven-dependencies

1 Comment

If you have a pom.xml file for your local jar (e.g., because you built it yourself) then you can use -DpomFile=<path-to-pom> to point at that. The groupId, artifactId, version and packaging arguments are then picked up from the pom file. See maven.apache.org/guides/mini/guide-3rd-party-jars-remote.html.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.