Maven jar插件 - SNAPSHOT依赖项的Class-Path条目错误。

13

我正在使用maven-jar-plugin构建JAR包,并使用maven-assembly-plugin将所有依赖项放置在JAR旁边的lib/目录中。

如果我在项目中使用快照依赖项,那么Class-Path条目指向的是不同于实际打包的依赖项的JAR

这是一个例子:

<dependency>
    <groupId>x.y.z</groupId>
    <artifactId>artifact</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

包含依赖的JAR被打包到lib目录下的名称为artifact-1.0-SNAPSHOT的文件中,但是主JAR清单文件中的Class-Path条目却指向lib/artifact-1.0-20170201.104414-8.jar

这里发生了什么?为什么会这样?

提前感谢您的回答。

我的assembly.xml文件如下:

<dependencySets>
    <dependencySet>
        <useProjectArtifact>false</useProjectArtifact>
        <useTransitiveDependencies>true</useTransitiveDependencies>
        <outputDirectory>lib</outputDirectory>
        <unpack>false</unpack>
    </dependencySet>
</dependencySets>

插件:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.2</version>
        <executions>
            <execution>
                <id>assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>attached</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                    <finalName>${dist.name}</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptor>${basedir}/assembly.xml</descriptor>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.1</version>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>lib/</classpathPrefix>
                </manifest>
                <manifestEntries>
                    <Class-Path>.</Class-Path>
                </manifestEntries>
            </archive>
            <outputDirectory>${dist.dir}</outputDirectory>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>test-jar</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
1个回答

20

你遭遇了MJAR-156的问题,该问题在最新版本3.0.2中仍未解决。核心问题出现在下游的Maven Archiver库中,很可能是MSHARED-169引起的。

你可以通过指定Maven Archiver不为快照创建唯一版本来轻松解决此问题。这由manifest配置下的参数useUniqueVersions控制,默认值为true。因此,你可以更改Jar插件的配置为:

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.0.2</version>
  <configuration>
    <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <classpathPrefix>lib/</classpathPrefix>
        <useUniqueVersions>false</useUniqueVersions>
      </manifest>
      <!-- rest of configuration -->
    </archive>
    <outputDirectory>${dist.dir}</outputDirectory>
  </configuration>
  <!-- the executions -->
</plugin>

请注意,Jar插件的2.3.1版本相当旧,您应该考虑升级到最新的3.0.2版本。


1
仍然在这里,使用3.1.0版本。 - Giovanni Toraldo
1
3.2.0也受到影响。 - Oleg Khaschansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接