Maven развертывает банку с зависимостями от репо
Я могу развернуть jar
, используя следующее в моем pom.xml
и запуске mvn deploy
:
<distributionManagement>
<repository>
<id>releases</id>
<url>http://${host}:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Internal Snapshots</name>
<url>http://${host}:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
И я могу создать исполняемый файл jar-with-dependencies
, используя следующее:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>create-executable-jar</id>
<phase>deploy</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>my.company.app.Main</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
Проблема в том, что я не знаю, как сшить их вместе, чтобы развернуть исполняемый файл jar
в моем репозитории Maven. Я действительно не знаю, достигнут ли это новым плагином или добавлением цели или другого шага к существующему плагину сборки.
Ответы
Ответ 1
По сути, моя трудность в этом показала тот факт, что мой pom.xml
уже вышел из рельсов. Все само собой разумеется. Я раньше делал:
- Сохранить все зависимости в папке lib
- Постройте банку с помощью classpath, которая вырезает эту папку lib
- Используйте плагин сборки, чтобы сделать еще одну развернутую банку
Я думаю, что было несколько причин, из-за которых этот подход имел смысл, особенно когда мои библиотеки не были хорошо учтены из моих приложений.
Однако, удаляя 1 и 2, все, что необходимо, - это раздел distributionManagement
, и фаза развертывания работает автоматически. Таким образом, все это удивительный случай буквально добавления функциональности, удаляя большие фрагменты кода.
Ответ 2
Если вы свяжете сборку с этапом упаковки, она будет устанавливать в вашем хранилище и "обычный" файл jar, и файл "с зависимостями" при сборке:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>my.company.app.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Затем просто запустите mvn clean install deploy
, чтобы загрузить оба файла в свой репозиторий.
Ответ 3
Чтобы создать (так называемый) Uber JAR и развернуть его с помощью maven, вы также можете использовать плагин затенения. Следующий код взят с их сайта, но я создал один или два проекта, используя эту функцию.
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>jackofall</shadedClassifierName> <!-- Any name that makes sense -->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
В этой конфигурации вы получаете Uber JAR как одно развертывание помимо обычного JAR. Затем пользователь вашего JAR файла может решить получить пакет "все в одном" или JAR файл с зависимостями, основанными на классификаторе.
Обычно я использую плагин shade для сборки Uber JAR (или каким-то образом модифицирую JAR) и использую плагин сборки для сборки таких вещей, как установочные пакеты (содержащие JAR и, возможно, другие вещи). Однако я не уверен, каковы цели отдельных плагинов.
Ответ 4
Сработало. Я собираюсь оставить этот вопрос открытым, потому что я не уверен, что это лучшая практика, но работа - это что-то.
Проблемы, которые я замечаю, это то, что я составил идентификационное имя, и я не знаю, является ли это обычной практикой и что мне нужно жестко закодировать имя jar; это не выводится ни от чего другого.
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>deploy-executable</id>
<goals>
<goal>deploy-file</goal>
</goals>
<configuration>
<file>target/Monitoring-Client-1.0-SNAPSHOT-jar-with-dependencies.jar</file>
</configuration>
</execution>
</executions>
</plugin>
Ответ 5
Сначала вы не должны делать создание ueber jar на этапе развертывания, лучше сделать это на фазе пакета. Кроме того, созданный файл jar обычно автоматически прикрепляется к вашему артефакту и будет передан в удаленный репозиторий (в вашем случае Nexus). Вы можете проверить это, если вы просто попытаетесь выполнить установку mvn и взгляните на результат, если созданный банку установлен в локальный репозиторий.
Чтобы развернуть результаты в nexus, вам нужно вызвать mvn deploy.