Maven and adding JARs to system scope
MavenMaven Problem Overview
I have a JAR in my Android project and I want it to be added to final APK. Okay, here I go:
<dependency>
<groupId>com.loopj.android.http</groupId>
<artifactId>android-async-http</artifactId>
<version>1.3.2</version>
<type>jar</type>
<scope>system</scope>
<systemPath>${project.basedir}/libs/android-async-http-1.3.2.jar</systemPath>
</dependency>
But when I am running mvn package
I am getting a warning:
[WARNING] Some problems were encountered while building the effective model for **apk:1.0
[WARNING] 'dependencies.dependency.systemPath' for com.loopj.android.http:android-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 25
And in the final APK there are no JARs.
How do I fix that?
Maven Solutions
Solution 1 - Maven
I don't know the real reason but Maven pushes developers to install all libraries (custom too) into some maven repositories, so scope:system
is not well liked, A simple workaround is to use maven-install-plugin
follow the usage:
write your dependency in this way
<dependency>
<groupId>com.mylib</groupId>
<artifactId>mylib-core</artifactId>
<version>0.0.1</version>
</dependency>
then, add maven-install-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>install-external</id>
<phase>clean</phase>
<configuration>
<file>${basedir}/lib/mylib-core-0.0.1.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>com.mylib</groupId>
<artifactId>mylib-core</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
pay attention to phase:clean
, to install your custom library into your repository, you have to run mvn clean
and then mvn install
Solution 2 - Maven
You will need to add the jar to your local maven repository. Alternatively (better option) specify the proper repository (if one exists) so it can be automatically downloaded by maven
In either case, remove the <systemPath>
tag from the dependency
Solution 3 - Maven
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
Try this.
Solution 4 - Maven
System scope was only designed to deal with 'system' files; files sitting in some fixed location. Files in /usr/lib
, or ${java.home}
(e.g. tools.jar
). It wasn't designed to support miscellaneous .jar
files in your project.
The authors intentionally refused to make the pathname expansions work right for that to discourage you. As a result, in the short term you can use install:install-file
to install into the local repo, and then some day use a repo manager to share.
Solution 5 - Maven
Try this configuration. It worked for me:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warSourceDirectory>mywebRoot</warSourceDirectory>
<warSourceExcludes>source\**,build\**,dist\**,WEB-INF\lib\*,
WEB-INF\classes\**,build.*
</warSourceExcludes>
<webXml>myproject/source/deploiement/web.xml</webXml>
<webResources>
<resource>
<directory>mywebRoot/WEB-INF/lib</directory>
<targetPath>WEB-INF/lib</targetPath>
<includes>
<include>mySystemJar1.jar.jar</include>
<include>mySystemJar2.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
Solution 6 - Maven
Use a repository manager and install this kind of jars into it. That solves your problems at all and for all computers in your network.
Solution 7 - Maven
mvn install:install-file -DgroupId=com.paic.maven -DartifactId=tplconfig-maven-plugin -Dversion=1.0 -Dpackaging=jar -Dfile=tplconfig-maven-plugin-1.0.jar -DgeneratePom=true
Install the jar to local repository.
Solution 8 - Maven
Thanks to Ging3r i got solution:
follow these steps:
-
don't use
in dependency tag. Use following in dependencies tag in pom.xml file:: <dependency> <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId> <artifactId>suitetalk-axis-proxy-v2019_1</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>com.netsuite.suitetalk.client.v2019_1</groupId> <artifactId>suitetalk-client-v2019_1</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.netsuite.suitetalk.client.common</groupId> <artifactId>suitetalk-client-common</artifactId> <version>1.0.0</version> </dependency>
-
use following code in plugins tag in pom.xml file:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> <executions> <execution> <id>suitetalk-proxy</id> <phase>clean</phase> <configuration> <file>${basedir}/lib/suitetalk-axis-proxy-v2019_1-1.0.0.jar</file> <repositoryLayout>default</repositoryLayout> <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId> <artifactId>suitetalk-axis-proxy-v2019_1</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <generatePom>true</generatePom> </configuration> <goals> <goal>install-file</goal> </goals> </execution> <execution> <id>suitetalk-client</id> <phase>clean</phase> <configuration> <file>${basedir}/lib/suitetalk-client-v2019_1-2.0.0.jar</file> <repositoryLayout>default</repositoryLayout> <groupId>com.netsuite.suitetalk.client.v2019_1</groupId> <artifactId>suitetalk-client-v2019_1</artifactId> <version>2.0.0</version> <packaging>jar</packaging> <generatePom>true</generatePom> </configuration> <goals> <goal>install-file</goal> </goals> </execution> <execution> <id>suitetalk-client-common</id> <phase>clean</phase> <configuration> <file>${basedir}/lib/suitetalk-client-common-1.0.0.jar</file> <repositoryLayout>default</repositoryLayout> <groupId>com.netsuite.suitetalk.client.common</groupId> <artifactId>suitetalk-client-common</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <generatePom>true</generatePom> </configuration> <goals> <goal>install-file</goal> </goals> </execution> </executions> </plugin>
I am including 3 jars from lib folder:
Finally, use mvn clean
and then mvn install
or 'mvn clean install' and just run jar file from target folder or the path where install(see mvn install
log):
java -jar abc.jar
note: Remember one thing if you are working at jenkins then first use mvn clean
and then mvn clean install
command work for you because with previous code mvn clean install
command store cache for dependency.
Solution 9 - Maven
Following this thread I was able to configure the install plugin to load my custom jar, but the plugin was not seeing my configuration
when running a mvn install
I'm using the base maven-install-plugin:2.5.2
using the maven:3.6.3-jdk-8
docker image.
I don't fully understand this note in the documentation (at the end of the section), but it seems that you can give the phase goal an execution id forcing it to use your configuration:
> Note: Configurations inside the
>mvn myqyeryplugin:queryMojo@execution1
My final working docker command:
docker run -it --rm --name parser -v "$(shell pwd)":/usr/src/parser -w /usr/src/parser maven:3.6.3-jdk-8 mvn -X install:install-file@install-my-jar-file
Where install-my-jar-file
is my executions id <execution><id>install-my-jar-file</id>...