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>
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.
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.
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.
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. ThesystemPath
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.
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>
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With