Maven: как запросить исполняемый путь к классам?
У меня есть проект Maven с некоторыми указанными зависимостями.
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
Как я могу запросить maven, чтобы узнать путь, который он использует для этих зависимостей, или путь к классу, который я должен использовать для независимого выполнения?
Моя цель - создать оболочку, которая запускает программу с соответствующим путем к классу.
1 ответ
В Maven доступно несколько альтернатив:
Maven Dependency Plugin (цель сборки-пути к классам)
Посмотрите на Maven Dependency Plugin, особенно цель build-classpath обеспечивает именно полный classpath для использования внешнего исполнения. Среди многих вариантов outputFile
Параметр может быть полезен.
Вам не нужно настраивать его для использования, просто запустите
mvn dependency:build-classpath
В вашем проекте вы увидите classpath как часть результатов сборки. Или же
mvn dependency:build-classpath -Dmdep.outputFile=classpath.txt
Чтобы перенаправить только путь к классу в файл.
Maven Dependency Plugin (цель копирования-зависимости)
Чтобы создать оболочку, вы также можете взглянуть на цель копирования-зависимости, которая будет копировать необходимые зависимости (jar-файлы), включая транзитивные зависимости, в настроенную папку (поэтому вам не нужны жестко закодированные пути к вашей локальной машине).
Пример настройки плагина доступен на официальном сайте здесь. Например, следующая конфигурация:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/dependencies</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Добавил бы в папку target/dependencies
все зависимости объявлены в области видимости compile
, ПРИМЕЧАНИЕ: в отношении связанного официального примера я добавил <includeScope>runtime</includeScope>
запись конфигурации (которая будет включать зависимости объема компиляции и времени выполнения, согласно документации и моим тестам), в противном случае она также будет включать test
объем по умолчанию (это то, что я считаю, вам не нужно во время выполнения).
Плагин Exec Maven (цели Java или Exec)
Кроме того, вы можете использовать плагин Exec Maven для выполнения main
из Maven, используя необходимый путь к классу.
Пример настройки плагина доступен на официальном сайте здесь.
Например, следующая конфигурация:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>my-execution</id>
<phase>package</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.sample.MainApp</mainClass>
</configuration>
</plugin>
Настроит плагин Exec для запуска через mvn exec:java
основной класс MainApp
как настроено, очевидно, с требуемым classpath.
Плагин Maven Assembly
Наконец, плагин Maven Assembly также предоставляет средства для создания исполняемого файла jar с зависимостями, как объясняется здесь, в другом вопросе о стековом потоке.