Maven SNAPSHOT имена файлов jar несовместимы с использованием Maven Assembly в файле MANIFEST

Вот сценарий:

Созданы два проекта Maven 3.

В сборке 1 есть ящики с моментальным снимком, которые развертываются в Nexus.

В сборке 2 есть зависимости от моментальных снимков, которые упоминаются как 1.0.0-SNAPSHOT, которые упаковываются и зашифровываются с помощью команды mvn clean package assembly:single.

Проблема, с которой мы сталкиваемся: Иногда, когда сборка создается, файл MANIFEST для флага иногда говорит some.jar.1.0.0-SNAPSHOT, и иногда он будет указывать метку some.jar.1.0.0-datetime, тем самым вызывая ошибки класса, не определенные.

Есть ли способ предотвратить эту проблему с именами в файле манифеста?

- редактировать -

Дальнейшие исследования обнаружили следующее:

"Если моментальный снимок был решен из репо, тогда он будет отмечен timestamped, если это произойдет из реактора или локального репо, тогда это будет -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 на основе приведенной выше цитаты.

Ответ 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

используйте <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>

Ответ 3

Для тех, кто сталкивается с этим и видит ответ от Стивена Коннолли, но все же в конечном итоге имеет исключения, это может быть связано с тем, что некоторые зависимости имеют классификаторы в своих именах. Затем вам придется адаптировать шаблон для использования dashClassifier в качестве необязательного значения:

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

Это будет работать, даже если у используемого метода dependecy нет классификатора.

Подробнее см. документацию для плагина сборки.