如何将本地Maven包jar文件添加到Maven项目

rjee0c15  于 10个月前  发布在  Maven
关注(0)|答案(2)|浏览(108)

摘要

当使用maven-install-plugin:install-file来安装maven jar包时,所有的依赖都被忽略了,这个插件写了一个dumb/broken pom文件。

上下文

我有一个本地的Maven包jar文件foo-java-1.2.3.jar,它在META-INF/maven/org.mizux.foo/foo-java/pom.xml中包含自己的pom.xml,几乎没有依赖关系

<dependencies>
  <dependency>
    <groupId>org.mizux.foo</groupId>
    <artifactId>foo-linux-x86-64</artifactId>
    <version>1.2.3</version>
    <type>jar</type>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.5.0</version>
  </dependency>
  <dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.12.2</version>
  </dependency>
</dependencies>

字符串
然后,我尝试在本地安装它,使用:

mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=foo-java.1.2.3.jar
mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=foo-linux-x86-64.1.2.3.jar


Ref:https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
注意:net.java.dev.jna:jna-platformcom.google.protobuf:protobuf-java可以在maven central.
然后当在Bar项目pom.xml中使用它时:

...
<dependencies>
  <dependency>
    <groupId>org.mizux.foo</groupId>
    <artifactId>foo-java</artifactId>
    <version>1.2.3</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
</dependencies>


mvn compile通过?
我不能运行我的Bar's main,因为foo-java的所有传递依赖都没有传递给Bar,所以我得到了一些java.lang.NoClassDefFoundError

mvn exec:java -Dexec.mainClass="org.mizux.bar.Test"
...
java.lang.NoClassDefFoundError: com/sun/jna/Platform


看看~/.m2/repository/org/mizux/foo/foo-java/1.2.3/foo-java-1.2.3.pom,这一个似乎只包含最小值(groupID,artifactID...),但整个依赖部分不存在!!

问题

  • 我如何安装本地maven jar包,以便安装的pom是完整的,而不是截断的版本。
  • 为什么安装插件生成这个虚拟的pom,而完整的一个存在于jar工件?

注:当在本地构建的foo-java上使用mvn install时,.m2中导出的pom有很大的不同,即它是foo-java原始pom.xml的副本!

%diff ~/.m2/repository/org/mizux/foo/foo-java/1.2.3/foo-java-1.2.3.pom .../foo-java/pom.xml


注2:这里是一个github项目来重现问题https://github.com/Mizux/java-ortools,你可以看看操作,看看Linux/macos/windows上的完整日志https://github.com/Mizux/java-ortools/actions和docker ubuntu容器

9w11ddsr

9w11ddsr1#

为什么安装插件生成这个虚拟的pom,而完整的一个存在于jar工件?
据医生说
如果本地存储库中还不存在POM,则通过参数pomFile.jsp为true生成工件的最小POM。
参考:https://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html#generatePom
现在我不知道我们是否可以强制maven-install-plugin复制jar文件中的pom.xml(艾德已经被插件解析了!)

Ugly workaround

我可以从.jar文件中提取pom.xml(它包含它!),然后在install-file命令中将它沿着到jar中。

unzip -j foo-java-1.2.3.jar META-INF/maven/org.mizux.foo/foo-java/pom.xml

mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file \
-Dfile=foo-java-1.2.3.jar -DpomFile=pom.xml

mvn compile

mvn exec:java -Dexec.mainClass="org.mizux.bar.Bar"

字符串

qvsjd97n

qvsjd97n2#

由于您所期望的功能不起作用:
要么使用最新版本的插件(3.0.0-M1),看看这是固定的
或者在debug(mvnDebug -X)中运行maven,并在下面的行中放置一个断点;对于所有重要的事情,您的maven文件可能已经损坏。

  • 在匹配了XML条目的点处,
  • 在此,将处理电子邮件条目
  • 由于您必须在IDE中进行调试,因此您可能还希望克隆GIT存储库并切换到标签as以匹配您使用的插件版本。

要么手动提取pom并传递它。

相关问题