87

我的 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 中没有 JAR。

我该如何解决?

4

9 回答 9

151

我不知道真正的原因,但 Maven 推动开发人员将所有库(也自定义)安装到一些 Maven 存储库中,所以scope:system不受欢迎,一个简单的解决方法是使用maven-install-plugin

遵循用法:

用这种方式写你的依赖

<dependency>
    <groupId>com.mylib</groupId>
    <artifactId>mylib-core</artifactId>
    <version>0.0.1</version>
</dependency>

然后,添加 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>

注意phase:clean,要将您的自定义库安装到您的存储库中,您必须运行mvn clean然后mvn install

于 2015-06-24T09:59:43.637 回答
25

您需要将 jar 添加到本地 maven 存储库。或者(更好的选择)指定适当的存储库(如果存在),以便它可以由 maven 自动下载

<systemPath>在任何一种情况下,从依赖项中删除标签

于 2012-06-07T15:46:08.203 回答
17
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

试试这个。

于 2017-12-07T02:09:16.647 回答
11

系统范围仅设计用于处理“系统”文件;位于某个固定位置的文件。/usr/lib,或${java.home}(例如tools.jar)中的文件。它并非旨在支持.jar项目中的杂项文件。

作者故意拒绝让路径名扩展正常工作以阻止您。因此,在短期内您可以使用install:install-file安装到本地 repo 中,然后有一天使用 repo manager 进行共享。

于 2012-06-07T16:25:59.817 回答
4

试试这个配置。它对我有用:

<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>
于 2015-07-08T12:43:24.257 回答
3

使用存储库管理器并将这种 jar 安装到其中。这完全解决了您的问题,适用于您网络中的所有计算机。

于 2012-06-07T16:02:20.853 回答
1

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

将 jar 安装到本地存储库。

于 2016-08-18T00:59:19.893 回答
0

感谢 Ging3r 我得到了解决方案:

跟着这些步骤:

  1. 不要在依赖标签中使用。在 pom.xml 文件的依赖项标记中使用以下内容::

    <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. 在 pom.xml 文件的 plugins 标签中使用以下代码:

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

我包括来自 lib 文件夹的 3 个罐子:

包括spring boot项目中的外部jar

最后,使用mvn clean然后mvn install或'mvn clean install'并从目标文件夹或安装路径运行jar文件(见mvn install日志):

java -jar abc.jar

注意:如果您在 jenkins 工作,请记住一件事,然后首先使用mvn clean然后mvn clean install命令为您工作,因为以前的代码mvn clean install命令存储缓存用于依赖。

于 2019-08-01T07:20:44.907 回答
0

在这个线程之后,我能够配置安装插件来加载我的自定义 jar,但是configuration在运行时插件没有看到我的mvn install

我正在使用maven-install-plugin:2.5.2使用maven:3.6.3-jdk-8docker 映像的基础。

我不完全理解文档中的这个注释(在本节的末尾),但似乎你可以给阶段目标一个执行 ID,强制它使用你的配置:

注意:元素内部的配置与外部的配置不同,因为它们不能从直接命令行调用中使用,因为它们仅在调用它们绑定到的生命周期阶段时应用。因此,您必须将配置部分移到执行部分之外,以将其全局应用于插件的所有调用。由于 Maven 3.3.1 不再是这种情况,因为您可以在命令行上指定直接插件目标调用的执行 ID。因此,如果您想从命令行运行上述插件并且它是特定的 execution1 配置,您可以执行:

mvn myqyeryplugin:queryMojo@execution1

我最后的工作 docker 命令:

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

install-my-jar-file我的处决 ID在哪里<execution><id>install-my-jar-file</id>...

于 2021-03-25T01:50:57.117 回答