【问题标题】:Maven dependency stripVersion creates wrong classpathMaven 依赖 stripVersion 创建错误的类路径
【发布时间】: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 -&gt; Maven Install(带有 m2e 插件的 Eclipse)

【问题讨论】:

  • 如何生成可执行 JAR?通常,不需要使用依赖插件。
  • 使用 maven-jar-plugin。我从我的 pom.xml 添加了配置。您的意思是 maven-jar-plugin 可以自己复制依赖项吗?我如何告诉它去除版本号?
  • 您可以为此目的使用shade-pluginassembly-plugin。这两个插件都能够创建一个 FAT JAR (您不需要在其中配置任何库名称)。程序集插件还能够创建一个 ZIP 文件 - 例如 - 它具有您可能想要的结构:一个可执行的 JAR 及其库在 lib 目录中。在这种情况下,您必须配置 jar-plugin 以引用正确的库。
  • 要配置jar-plugin,另见Maver Archiver Reference
  • 谢谢。我对创建 FAT JAR 不感兴趣。据我所知,使用程序集插件意味着我必须为此任务创建自己的程序集描述符(如果我错了,请纠正我!),我宁愿避免。至于 jar-plugin - 我找不到引用库的选项。你能指出正确的设置选项吗? (是includes 吗?在我看来,这似乎是一个包含资源的选项,不是吗?)

标签: java eclipse maven


【解决方案1】:

更改 maven-jar-plugin 以创建没有版本的自定义类路径布局

例子:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <classpathLayoutType>custom</classpathLayoutType>
                        <customClasspathLayout>lib/$${artifact.artifactId}.$${artifact.extension}</customClasspathLayout>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 2011-11-29
    • 2011-10-29
    • 2021-11-06
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多