Подтвердить что ты не робот

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

4b9b3361

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