【发布时间】:2017-10-11 03:25:36
【问题描述】:
我正在尝试使用 Maven(通过 Eclipse)编译一个项目,同时从依赖项 JAR 中剥离版本。我的 pom.xml 中有以下内容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
确实,JAR 被复制到 lib/ 中而没有版本号。唉,我得到了 ClassNotFound,因为生成的可执行 JAR 中的 MANIFEST.MF 包含一个引用文件的类路径,包括版本号,这些文件自然不存在。
我做错了什么,我该如何解决?
编辑:JAR 是使用 maven-jar-plugin 创建的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>my.main.class</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
我正在使用Run as -> Maven Install(带有 m2e 插件的 Eclipse)
【问题讨论】:
-
如何生成可执行 JAR?通常,不需要使用依赖插件。
-
使用 maven-jar-plugin。我从我的 pom.xml 添加了配置。您的意思是 maven-jar-plugin 可以自己复制依赖项吗?我如何告诉它去除版本号?
-
您可以为此目的使用shade-plugin 或assembly-plugin。这两个插件都能够创建一个 FAT JAR (您不需要在其中配置任何库名称)。程序集插件还能够创建一个 ZIP 文件 - 例如 - 它具有您可能想要的结构:一个可执行的 JAR 及其库在 lib 目录中。在这种情况下,您必须配置 jar-plugin 以引用正确的库。
-
要配置jar-plugin,另见Maver Archiver Reference。
-
谢谢。我对创建 FAT JAR 不感兴趣。据我所知,使用程序集插件意味着我必须为此任务创建自己的程序集描述符(如果我错了,请纠正我!),我宁愿避免。至于 jar-plugin - 我找不到引用库的选项。你能指出正确的设置选项吗? (是
includes吗?在我看来,这似乎是一个包含资源的选项,不是吗?)