Maven SNAPSHOT jar 文件名与 MANIFEST 文件中的 Maven Assembly 不一致



这是场景:

两个 Maven 3 项目构建。

Build 1 具有部署到 Nexus 的快照 jar。

Build 2 依赖于快照,引用于 1.0.0-SNAPSHOT,使用 mvn clean package assembly:single 命令打包和压缩。

我们遇到的问题:有时,在创建程序集时,jar 的 MANIFEST 文件有时会显示 some.jar.1.0.0-SNAPSHOT,有时会说 some.jar.1.0.0-datetime 戳,从而导致类未定义错误。

有没有办法防止清单文件中出现此命名问题?

--编辑--

进一步的研究发现:

"如果快照是从存储库解析的,那么它将带有时间戳, 如果它来自反应器或本地存储库,那么它将是 -SNAPSHOT。 该插件调用 maven 解析逻辑,因此这是核心 maven 行为。">

这正是遇到的问题。 第二个构建清单文件始终具有 ./lib/Framework-1.0.0-SNAPSHOT.jar根据上面的引用,实际的 jar 文件名在 ./lib/Framework-1.0.0-SNAPSHOT.jar 和 ./lib/Framework-1.0.0-.jar timestamp 之间变化。

<dependencySet>中,您需要设置<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

例如:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <id>appserverB</id>
  <formats>
    <format>zip</format>
  </formats>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/lib</outputDirectory>
      <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>
      <includes>
        <include>application:logging</include>
        <include>application:core</include>
        <include>application:utils</include>
        <include>application:appserverB</include>
      </includes>
    </dependencySet>
  </dependencySets>
</assembly>

如果您使用的是内置程序集描述符之一,则需要自己复制它并自己添加outputFileNameMapping条目

对于使用 maven-jar-plugin 创建工件然后由maven-assembly-plugin打包并且您仍然在工件名称的类路径中看到时间戳的人,您可以通过设置 useUniqueVersions=false 来禁用它,如下所示:

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>${project.build.finalName}.lib/</classpathPrefix>
            <mainClass>com.nate.Application</mainClass>
            <!-- To force the use of '-SNAPSHOT' version naming, simply disable the <useUniqueVersions>  -->
            <useUniqueVersions>false</useUniqueVersions>
        </manifest>
        <manifestEntries>
            <buildTime>${maven.timestamp}</buildTime>
        </manifestEntries>
    </archive>
</configuration>

当你需要复制依赖时,使用<useBaseVersion>false</useBaseVersion>。例如:

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.8</version>
                    <executions>
                        <execution>
                            <id>copy</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${project.build.directory}</outputDirectory>
                                <useBaseVersion>false</useBaseVersion>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

对于那些遇到这种情况并看到 Stephen Connolly 的答案但最终仍然有异常的人来说,这可能是因为某些依赖项的名称中有分类器。然后,您必须调整模式以使用 dashClassifier 作为可选值:

<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>

即使使用的依赖项没有分类器,这也将起作用。

有关更多详细信息,请参阅程序集插件的文档。

<useBaseVersion>false</useBaseVersion> 为我做了这个把戏。我刚刚切换到一个 SNAPSHOT 分支,它包括时间戳。

使用快照的主要优点是可以参考构建快照的实际日期/时间。

最新更新