Я несколько новичок в работе Maven и Jenkins.
У меня есть проект, который создает JAR, а JAR вместе со своими сопутствующими файлами (pom, sha1, md5 и т.д.) Доступны через репозиторий Maven, который может принимать Jenkins. Я могу видеть эти файлы, когда я перехожу к моей машине сборки, например:
http://myhostname:8080/plugin/repository/everything/com/example/projectname/0.7/
Один из членов моей команды имеет цель построения затененной JAR, которой нужны другие проекты. Я хотел бы получить этот затененный JAR в репозиторий Maven. В pom.xml эта строка управляет тем, что вызывается затененным JAR:
<finalName>${project.artifactId}-${project.version}-with-dependencies</finalName>
И в моем проекте я бы мог:
"com.example" % "projectname-with-dependencies" % "0.7" (I suspect - yes?)
Мне кажется, что все в порядке - подскажите, как я расскажу Дженкинсу о том, чтобы вывести этот JAR из целевой папки (где он правильно вставлен после завершения сборки) и сделать его доступным в репозитории Maven, подходящем для включения в другие проекты?
Надеюсь, это имеет смысл, и я могу получить немного взрослого надзора;)
EDIT - в соответствии с запросом, соответствующую часть pom.xml в разделе:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${project.artifactId}-${project.version}-with-dependencies</finalName>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.projectname.Projectname</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
Вот работа, которая, как мне кажется, должна работать в вашем случае (хотя я использовал ее несколько иначе).
У нас есть один проект ProjectAbcd, содержащий исходный код, ресурсы и т.д., Который используется для создания регулярной (не затененной) банки. Помп для этого проекта не содержит плагин maven-shade, так как мы не делаем затенение здесь.
Затем мы создаем второй проект с немного другим именем и артефактомID ProjectAbcdWithDependencies, который пуст, за исключением довольно простого файла pom. Этот файл pom содержит только одну зависимость (ProjectAbcd) и включает плагин maven-shade. Для теневого плагина он не устанавливает окончательное имя, как вы это делаете выше, потому что artifactId уже содержит суффикс "WithDependencies".
Когда maven упаковывает этот второй проект, он вытаскивает оргинальный, захватывает все исходные зависимости и затеняет их все вместе в одной банке, чье имя будет получено из pom artifactId. Любой последующий шаг установки или выпуска должен работать из коробки.
Вот первый проект первого проекта:
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>...</groupId>
<artifactId>ProjectAbcd</artifactId>
<packaging>jar</packaging>
<version>8.1-SNAPSHOT</version>
<name>ProjectAbcd</name>
...
</project>
Что еще более важно, вот один из второго проекта:
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>...</groupId>
<artifactId>ProjectAbcdWithDependencies</artifactId>
<packaging>jar</packaging>
<version>8.1-SNAPSHOT</version>
<name>ProjectAbcdWithDependencies</name>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>ProjectAbcd</artifactId>
<version>8.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Я ожидаю, что вам нужно будет добавить еще один шаг сборки maven к Jenkins после основного этапа сборки, который использует цель установки: install-file, чтобы вручную установить заштрихованную банку.
На этом этапе вы можете обрабатывать затененную банку как еще одну стороннюю банку, которую необходимо установить вручную, используя maven-install-plugin.
например
mvn install:install-file -Dfile=<project-path>/target/<shaded-jar>
Поскольку теневой файл jar был создан maven, он будет иметь свой pom.xml, встроенный в файл jar, поэтому maven автоматически подберет его и установит в нужное место в вашем локальном репозитории.