Maven 并将 JAR 添加到系统范围

我在我的 Android 项目中有一个 JAR,我希望它被添加到最终的 APK。 好了,我要说了:

    <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>

但当我运行 mvn package时,我得到了一个警告:

[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

在最后的 APK 中没有罐子。

我该怎么补救?

128517 次浏览

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

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.

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.

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

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>

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.

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>

Try this.

Thanks to Ging3r i got solution:

follow these steps:

  1. 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>
    
  2. 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:

including external jar in spring boot project

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.

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 element used to differ from those that are outside in that they could not be used from a direct command line invocation because they were only applied when the lifecycle phase they were bound to was invoked. So you had to move a configuration section outside of the executions section to apply it globally to all invocations of the plugin. Since Maven 3.3.1 this is not the case anymore as you can specify on the command line the execution id for direct plugin goal invocation. Hence if you want to run the above plugin and it's specific execution1's configuration from the command-line, you can execute:

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>...