18

这是场景:

两个 Maven 3 项目构建。

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

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

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

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

- 编辑 -

进一步的研究发现了以下内容:

“如果快照是从 repo 解析的,那么它将被加上时间戳,如果它来自反应器或本地 repo,那么它将是 -SNAPSHOT。插件调用 maven 解析逻辑,所以这是核心 maven 行为。“

这是正在遇到的确切问题。第二个构建清单文件始终具有./lib/Framework-1.0.0-SNAPSHOT.jar条目,其中实际 jar 文件名在./lib/Framework-1.0.0-SNAPSHOT.jar./lib/之间更改Framework-1.0.0-timestamp.jar基于上面的引用。

4

5 回答 5

9

<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自己添加条目

于 2012-08-14T08:48:55.087 回答
3

对于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>
于 2018-10-11T11:42:30.723 回答
2

使用<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>
于 2016-03-03T04:06:17.967 回答
0

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

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

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

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

于 2016-06-21T14:39:59.713 回答
-1

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

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

于 2020-05-10T19:46:16.683 回答