Имея стороннюю банку, включенную в затененную банку Maven, не добавляя ее в локальный репозиторий

Я уже нашел ответ здесь, в Stack Overflow, как включить сторонний JAR в проект, не устанавливая его в "локальный репозиторий":

Могу ли я добавить банки в maven 2 build classpath без их установки?

Но когда я использую Maven Shade Plugin для создания JAR, который включает все зависимости проекта, сторонний JAR не включается автоматически.

Как я могу заставить Maven Shade Plugin добавить такой сторонний JAR в затененный JAR?


В соответствии с полученным ответом я заработал. Что я сделал, добавил этот фрагмент к началу моего pom.xml:

<repositories>
  <repository>
    <id>repo</id>
    <url>file://${basedir}/repo</url>
  </repository>
</repositories>

Затем добавлена ​​зависимость для моего проекта, а также pom.xml:

<dependencies>
  <dependency>
    <groupId>dummy</groupId>
    <artifactId>dummy</artifactId>
    <version>0.0.0</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

И затем запустил командную строку, чтобы добавить пакет в 'repo':

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file
    -Dfile=<my-jar>.jar -DgroupId=dummy -DartifactId=dummy
    -Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/

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

Содержимое подкаталога repo теперь:

repo/dummy/dummy/0.0.0/dummy-0.0.0.jar
repo/dummy/dummy/0.0.0/dummy-0.0.0.pom
repo/dummy/dummy/maven-metadata-local.xml

Теперь я могу проверить это на управление версиями и не иметь локальных или удаленных зависимостей.

Ответ 1

Но когда я использую Maven Shade Plugin для создания JAR, который включает все зависимости проекта, сторонний JAR не включается автоматически.

Да, поскольку предполагается, что видимые области system всегда присутствуют (это именно то, что касается области system), поэтому они не будут включены. Люди на самом деле не понимают, какими system зависимостями сферы видимости, они просто продолжают злоупотреблять ими (да, это злоупотребление), а затем получают побочные эффекты и удивляются, почему (как указал Брайан в ответ).

Я уже писал многие, многие, действительно много раз об этом здесь, на SO и в 99% случаев, следует избегать зависимостей с привязкой system. И я еще раз повторю, что "Зависимости" мини-гид говорит еще раз:

  • system. Эта зависимость требуется на определенной стадии жизненного цикла вашего проекта, но зависит от системы. Использование этой области не рекомендуется: это считается "расширенной" функцией, и ее следует использовать только тогда, когда вы действительно понимаете все последствия ее использования, которые могут быть чрезвычайно сложными, если на самом деле невозможно количественно определить. Этот объем по определению делает вашу сборку не переносной. Это может быть необходимо в некоторых случаях. Область системы включает элемент <systemPath>, который указывает на физическое местоположение этой зависимости на локальном компьютере. Таким образом, он используется для обозначения какого-либо артефакта, ожидаемого на данном локальном компьютере, а не в репозитории; и путь которого может изменяться от машины к машине. Элемент systemPath может ссылаться на переменные среды по своему пути: ${JAVA_HOME} например.

Итак, вместо использования области system либо:

  • Добавьте свои библиотеки в локальный репозиторий через install:install-file. Это быстрый и грязный способ заставить все работать, это может быть вариант, если вы один, но он делает вашу сборку не переносной.
  • Установите и запустите "корпоративный репозиторий", например Nexus, Archiva или Artifactory, и добавьте свои библиотеки через deploy:deploy-file. Это сценарий идеальный.
  • Установите репозиторий на основе файлов, как описано в этом предыдущем ответе, и разместите там свои библиотеки. Это лучший компромисс, если у вас нет корпоративного репозитория, но вам нужно работать в команде и не хотите жертвовать переносимостью.

Пожалуйста, прекратите использование области system.

Ответ 3

Используемые <resources> включить мою библиотеку со всеми банками. то есть:

<build>
    <resources>
        <resource>
            <directory>${project.basedir}</directory>
            <includes>
                <include>lib/*.jar</include>
            </includes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>