Сборка Maven 2 с зависимостями: jar под областью "system" не включен

Я использую плагин maven-assembly для создания jar моего приложения, включая следующие зависимости:

<assembly>
    <id>macosx</id>
    <formats>
       <format>tar.gz</format>
       <format>dir</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <includes>
                <include>*:jar</include>
            </includes>
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>
</assembly>

(Я пропустил некоторые другие вещи, которые не связаны с вопросом)

До сих пор это работало нормально, потому что это создает lib каталог со всеми зависимостями. Однако недавно я добавил новую зависимость, область которой systemи не копирует его в lib выходной каталог. Должно быть, я что-то упустил здесь, поэтому я зову на помощь.

Зависимость, которую я только что добавил:

<dependency>
  <groupId>sourceforge.jchart2d</groupId>
  <artifactId>jchart2d</artifactId>
  <version>3.1.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath>
</dependency>

Единственным способом, которым я смог включить эту зависимость, было добавление следующего к элементу сборки:

<files>
    <file>
        <source>external/jchart2d-3.1.0.jar</source>
        <outputDirectory>lib</outputDirectory>
    </file>
</files>

Однако это вынуждает меня менять pom и файл сборки всякий раз, когда этот jar-файл переименовывается, если вообще когда-либо. Кроме того, это кажется просто неправильно.

Я пробовал с <scope>runtime</scope> в dependencySets а также <include>sourceforge.jchart2d:jchart2d</include> без удачи

Так как вы включаете system скопировать банку в ваш файл сборки в Maven 2?

большое спасибо

7 ответов

Решение

Я не удивлен, что зависимости от области видимости системы не добавляются (в конце концов, зависимости от области видимости системы должны быть явно предоставлены по определению). На самом деле, если вы действительно не хотите помещать эту зависимость в свой локальный репозиторий (например, потому что хотите распространять ее как часть вашего проекта), я бы сделал следующее:

  • Я бы поместил эту зависимость в "хранилище файловой системы", локальное для проекта.
  • Я бы объявил, что хранилище в моем pom.xml как это:

    <repositories>
      <repository>
        <id>my</id>
        <url>file://${basedir}/my-repo</url>
      </repository>
    </repositories>
    
  • Я бы просто объявил артефакт без system сфера, это всего лишь источник неприятностей:

    <dependency>
      <groupId>sourceforge.jchart2d</groupId>
      <artifactId>jchart2d</artifactId>
      <version>3.1.0</version>
    </dependency>
    

Я не уверен на 100%, что это подойдет вашим потребностям, но я думаю, что это лучшее решение, чем использование системы.

Обновление: я должен был упомянуть это в своем первоначальном ответе, и я исправляю это сейчас. Чтобы установить стороннюю библиотеку в файловом хранилище, используйте install:install-file с localRepositoryPath параметр:

mvn install:install-file -Dfile=<path-to-file> \
                         -DgroupId=<myGroup> \
                         -DartifactId=<myArtifactId> \
                         -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> \
                         -DlocalRepositoryPath=<path-to-my-repo>

Вы можете вставить это как есть в * nix shell. На окнах удалите " \ "и положить все в одну строку.

Кстати, вы можете автоматизировать это и сделать его частью вашей Maven сборки. Следующее установит ваш jar в ваш локальный репозиторий перед компиляцией:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>hack-binary</id>
                    <phase>validate</phase>
                    <configuration>
                        <file>${basedir}/lib/your-lib.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>your-group</groupId>
                        <artifactId>your-artifact</artifactId>
                        <version>0.1</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Я нахожу легкое решение, если вы создаете банку

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.1.1</version>
  <configuration>
    <webResources>
    <resource>
      <directory>dependencies/mydep</directory>
        <targetPath>WEB-INF/lib</targetPath>
        <filtering>true</filtering>
        <includes>
           <include>**/*.jar</include>
        </includes>
    </resource>
  </webResources>
</configuration>
</plugin>

Вы также можете справиться с этим, добавив дополнительный зависимый набор в ваши зависимые наборы.

<dependencySet>
  <scope>system</scope>
  <includes>
    <include>*:jar</include>
  </includes>
  <outputDirectory>lib</outputDirectory>
</dependencySet>

Лучше всего было бы использовать менеджер репозитория (например, Nexus, Artifactory, Archiva) и установить этот тип зависимости в конкретном репозитории. После этого вы можете использовать такие вещи, как простая зависимость. Это упростит вашу жизнь.

Документы: https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

Отредактировано: извините, что я не понял, что alx также упомянул об обходном пути чистого жизненного цикла.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <executions>
        <execution>
            <id>hack-binary</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/your-lib.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>your-group</groupId>
                <artifactId>your-artifact</artifactId>
                <version>0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Основываясь на решении, предоставленном alx, вы можете выполнить этап установки файла на чистой фазе. но так как чистая фаза не находится в жизненном цикле по умолчанию, вы должны выполнить mvn clean в первый раз, чтобы убедиться, что банка готова в местном репо.

пример: mvn clean; мвн пакет

Простое решение для этого - добавить его в локальный репозиторий Maven.

Один из способов сделать это - установить команды mvn, как предложено в предыдущем посте.

Еще один простой способ: 1) В вашем eclipse ide щелкните правой кнопкой мыши на проекте и выберите опцию Maven . 2) Выберите Установить или развернуть артефакт в хранилище maven и нажмите "Далее". 3) Нажмите на кнопку просмотра рядом с флажком Artifact file и выберите файл JAR. 4) Введите GroupId,ArtifactId и версию, чтобы убедиться, что генерация pom и создание контрольной суммы проверены, а упаковка - jar.

Нажмите на финиш, Уолла!!! Ваша работа завершена, jar добавлен в ваш локальный репозиторий, который вы можете определить в каталоге setting.xml или m2

Теперь просто добавьте простую зависимость maven в соответствии с GroupId,ArtifactId и версией jar, которую вы ввели в соответствии с импортом, и это - то, что ваш внешний jar будет упакован maven.

В моем решении это сработало проще:

удалить из вашей зависимости:

<dependency>
  <groupId>tiago.medici</groupId>
  <artifactId>eureka</artifactId>
  <version>0.0.1</version>
</dependency> 

Затем добавьте maven-install-plugin в файл pom.xml.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-external</id>
      <phase>clean</phase>
      <configuration>
        <file>${basedir}/external/tiago.medici-0.0.1.jar</file>
        <repositoryLayout>default</repositoryLayout>
        <groupId>tiago.medici</groupId>
        <artifactId>eureka</artifactId>
        <version>0.0.1</version>
        <packaging>jar</packaging>
        <generatePom>true</generatePom>
      </configuration>
      <goals>
        <goal>install-file</goal>
      </goals>
    </execution>
  </executions>
</plugin>
Другие вопросы по тегам