【问题标题】:Maven SNAPSHOT jar file names not consistent using Maven Assembly in MANIFEST file在 MANIFEST 文件中使用 Maven 程序集的 Maven SNAPSHOT jar 文件名不一致
【发布时间】:2012-05-18 12:11:26
【问题描述】:

这是场景:

两个 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戳,从而导致类未定义错误。

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

--编辑--

进一步研究发现:

"如果快照是从 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 基于上面的引用。

【问题讨论】:

  • This 可能会有所帮助,它描述了设置 outputfilenamemapping 以使文件名在快照中保持一致。
  • SNAPSHOT 的清单是如何生成的,它是如何配置来生成此信息的?此外,为什么要调用 mvn clean package assembly:single 而不是简单地调用 mvn clean package 因为 package 会调用配置的 assembly-plugin。
  • 快照本身没有清单。有问题的清单在第二个版本中。在一位同事的帮助下,我们发现了这个If the snapshot was resolved from a repo then it will be timestamped, if it came from the reactor or local repo, then it will be -SNAPSHOT. The plugin calls into the maven resolution logic so this is core maven behavior. 这正是我遇到的问题,我只需要解决这个问题。至于为什么调用 package assembly:single,那是因为我们对 maven 整体来说是新手。

标签: maven nexus snapshot maven-assembly-plugin


【解决方案1】:

<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 条目

【讨论】:

    【解决方案2】:

    当你需要复制依赖时使用&lt;useBaseVersion&gt;false&lt;/useBaseVersion&gt;。 例如:

                    <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>
    

    【讨论】:

      【解决方案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.nafora.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>
      </plugin>
      

      【讨论】:

        【解决方案4】:

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

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

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

        有关详细信息,请参阅documentation for the assembly plugin

        【讨论】:

          【解决方案5】:

          &lt;useBaseVersion&gt;false&lt;/useBaseVersion&gt; 为我成功了。我刚刚切换到一个 SNAPSHOT 分支,它包含了时间戳。

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

          【讨论】:

            猜你喜欢
            • 2017-10-04
            • 1970-01-01
            • 1970-01-01
            • 2010-12-12
            • 1970-01-01
            • 1970-01-01
            • 2012-03-23
            • 2016-07-26
            • 2016-07-09
            相关资源
            最近更新 更多