摘要
当使用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-platform
和com.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容器
2条答案
按热度按时间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中。
字符串
qvsjd97n2#
由于您所期望的功能不起作用:
要么使用最新版本的插件(3.0.0-M1),看看这是固定的
或者在debug(
mvnDebug -X
)中运行maven,并在下面的行中放置一个断点;对于所有重要的事情,您的maven文件可能已经损坏。要么手动提取pom并传递它。