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 нет классификатора.
Подробнее см. документацию для плагина сборки.