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 с зависимостями, как объясняется здесь, в другом вопросе о стековом потоке.

Другие вопросы по тегам