Сборка Maven 2 с зависимостями: jar под областью "system" не включен - PullRequest
58 голосов
/ 14 января 2010

Я использую плагин 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 ]

79 голосов
/ 15 января 2010

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

  • Я бы поместил эту зависимость в «хранилище файловой системы», локальное для проекта.
  • Я бы объявил этот репозиторий в моем 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. В Windows удалите «\» и поместите все в одну строку.

24 голосов
/ 10 апреля 2010

Кстати, вы можете автоматизировать это и сделать его частью вашей 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>
15 голосов
/ 03 ноября 2011

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

<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>
5 голосов
/ 03 ноября 2011

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

<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

2 голосов
/ 26 октября 2015

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

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

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

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

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

2 голосов
/ 05 июня 2014

Отредактировано: Извините, что я не понял, что 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; пакет мвн

1 голос
/ 15 марта 2018

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

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

<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>
...