Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven: System dependency pointing to multiple jars

Tags:

java

maven-2

Is it possible to define a dependency in the pom such that it has the scope of system but points to multiple jars?

I'm sure this is quite unorthodox, however, I was just wondering whether this was even possible. So something like:

<dependency>
  <groupId>foo</groupId>
  <artifactId>foo</artifactId>
  <version>1.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/lib/foo/*.jar</systemPath>
</dependency>
like image 203
digiarnie Avatar asked Aug 16 '10 04:08

digiarnie


People also ask

Are Maven dependencies included in jar?

Apache Maven Shade Plugin provides the capability to package the artifact in an uber-jar, which consists of all dependencies required to run the project.

What is classpath in Maven?

The reported classpath consists of references to JAR files cached in local Maven repository. Even the JAR artifact of the project is referenced from local Maven cache and not from the /target directory one or the other might expect.

What is dependency mediation in Maven?

Dependency mediation - this determines what version of an artifact will be chosen when multiple versions are encountered as dependencies. Maven picks the "nearest definition". That is, it uses the version of the closest dependency to your project in the tree of dependencies.


3 Answers

First (and I'll never repeat it enough), using system scoped dependencies is discouraged unless you know exactly what you're doing. From Dependency Scopes:

system: This dependency is required in some phase of your project's lifecycle, but is system-specific. Use of this scope is discouraged: This is considered an "advanced" kind of feature and should only be used when you truly understand all the ramifications of its use, which can be extremely hard if not actually impossible to quantify. This scope by definition renders your build non-portable. It may be necessary in certain edge cases. The system scope includes the <systemPath> element which points to the physical location of this dependency on the local machine. It is thus used to refer to some artifact expected to be present on the given local machine an not in a repository; and whose path may vary machine-to-machine. The systemPath element can refer to environment variables in its path: ${JAVA_HOME} for instance.

Now, to strictly answer your question, declaring a dependency with a system scope that would point on several jars is "possible" IF the dependency has a MANIFEST.MF listing other JARs relatively in its Class-Path entry. Something like this (assuming the "root" dependency is in lib):

Class-Path: ../lib/bar.jar ../lib/foo.jar

But I do NOT recommend this approach, especially in your particular case. Instead, have a look at this previous answer where I describe how to setup a file-based repository.

like image 92
Pascal Thivent Avatar answered Nov 08 '22 20:11

Pascal Thivent


As far as I understand, you are looking for a simple way to manage dependencies to local jar files (located in '${basedir}/lib/foo/' folder in your case). Using addjars-maven-plugin that's simple. Just add the following declaration to your pom:

<plugin>
  <groupId>com.googlecode.addjars-maven-plugin</groupId>
  <artifactId>addjars-maven-plugin</artifactId>
  <version>1.0.2</version>
  <executions>
    <execution>
        <goals>
            <goal>add-jars</goal>
        </goals>
        <configuration>
            <resources>
                <resource>
                    <directory>${basedir}/lib/foo</directory>
                </resource>
            </resources>
        </configuration>
    </execution>
  </executions>
</plugin>
like image 40
user1195526 Avatar answered Nov 08 '22 20:11

user1195526


I've never done this but according to maven's core concepts, I think it may not be possible because every artifact is represented by a single entity (a jar, zip, tar, etc.). Hence it may not be possible to have multiple jars representing a single artifact.

Morever system scope dependencies are assumed always available and not looked up in the repo. These should be only limited to jvm or jdk related dependencies (which are now provided by the jdk but earlier were available as separate downloads)

like image 3
naikus Avatar answered Nov 08 '22 20:11

naikus