Как я могу получить артефакты Maven в хранилище Jenven Maven?

1

Я несколько новичок в работе 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>
  • 0
    Как строится затененный JAR? Это также проект Maven?
  • 0
    Это цель в файле pom.xml. JAR помещается в целевой каталог вместе с JAR проекта. Таким образом, целевой каталог тогда имеет project-0.7.jar и project-0.7-with-dependencies.jar, и я хотел бы ОБА из них доступны через репозиторий Jenkins Maven.
Показать ещё 3 комментария
Теги:
maven
jenkins

2 ответа

1
Лучший ответ

Вот работа, которая, как мне кажется, должна работать в вашем случае (хотя я использовал ее несколько иначе).

У нас есть один проект 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>
  • 0
    Это сработало! И побочным преимуществом является то, что теперь мы можем использовать разные ветви для полностью затененных и не затененных, чтобы позволить различным потребителям идти по разным путям развития (да, звучит удивительно, но наличие полностью затененного JAR будет на нашем пути - Край нестабильной ветки полезен в этом проекте. Хороший побочный эффект)
0

Я ожидаю, что вам нужно будет добавить еще один шаг сборки maven к Jenkins после основного этапа сборки, который использует цель установки: install-file, чтобы вручную установить заштрихованную банку.

На этом этапе вы можете обрабатывать затененную банку как еще одну стороннюю банку, которую необходимо установить вручную, используя maven-install-plugin.

например

mvn install:install-file -Dfile=<project-path>/target/<shaded-jar>

Поскольку теневой файл jar был создан maven, он будет иметь свой pom.xml, встроенный в файл jar, поэтому maven автоматически подберет его и установит в нужное место в вашем локальном репозитории.

  • 0
    Это почти работает. [INFO] Установка /var/lib/jenkins/jobs/Tokenizer/workspace/target/projectname-0.7-with-dependencies.jar в /home/cambler/.m2/repository/com/example/projectname/0.7/projectname-0.7 .jar Итак, это помещается в мой локальный репозиторий. Я хочу, чтобы в репозитории Maven служил Дженкинс. URL myhostname: 8080 / плагин / хранилище, например.
  • 0
    tl; dr выше: он устанавливается в моем локальном репозитории, а не на сервере репозитория, который предоставляет Jenkins
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню