这是场景:
两个 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 分支,它包括时间戳。
使用快照的主要优点是可以参考构建快照的实际日期/时间。