В Maven, как вывести используемый путь к классам?
Для моих текущих целей у меня есть проект Maven, который создает war
файл, и я хочу увидеть, какой фактический путь к классу он использует при создании war
, Есть ли способ сделать это в одной команде - без необходимости компилировать весь проект?
Одна идея состоит в том, чтобы Maven генерировал target/classpath.properties
файл, а затем остановиться в этой точке.
6 ответов
Чтобы получить classpath самостоятельно в файле, вы можете:
mvn dependency:build-classpath -Dmdep.outputFile=cp.txt
Или добавьте это в POM.XML:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>build-classpath</id>
<phase>generate-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<!-- configure the plugin here -->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
От: http://maven.apache.org/plugins/maven-dependency-plugin/usage.html
Эта команда выводит classpath на Mac и Linux:
mvn -q exec:exec -Dexec.executable=echo -Dexec.args="%classpath"
Распечатка результата и его сохранение в файл может быть полезным, например, при назначении результата переменной в сценарии Bash. Это решение работает только на Mac и Linux, но также и скрипты оболочки Bash.
В Windows (например, в файлах BAT), где нет echo
исполняемый файл, вам понадобится что-то вроде этого (не проверено):
mvn -q exec:exec -Dexec.executable=cmd -Dexec.args="/c echo %classpath"
Кроме того, вы можете просто выполнить java
Запрограммируйте путь к классу:
mvn -q exec:exec -Dexec.executable=java -Dexec.args="-cp %classpath Main"
Или даже так (он будет использовать правильный путь к классу автоматически):
mvn -q exec:java -Dexec.mainClass="Main"
Однако оба этих альтернативных подхода страдают от добавления Maven сообщений об ошибках при сбое вашей программы.
Как отметил ecerulm в своем комментарии к ответу Яника, вы можете указать dependency:build-classpath
, поскольку выход classpath будет отличаться для разных областей (по умолчанию test
используется по какой-то причине). Я закончил с такой командой:
mvn -DincludeScope=compile dependency:build-classpath
Внутри POM его можно использовать так:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>build-classpath</id>
<phase>generate-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<includeScope>compile</includeScope>
<!-- Omit to print on console: -->
<outputFile>${project.build.directory}/compile-classpath.txt</outputFile>
</configuration>
</execution>
<execution>
<id>build-test-classpath</id>
<phase>generate-test-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<includeScope>test</includeScope>
<!-- Omit to print on console: -->
<outputFile>${project.build.directory}/test-classpath.txt</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
Это выведет 2 версии classpath, одну для основной сборки и другую для тестов.
Команда mvn dependency:list
перечислит classpath со всеми jar-файлами, используемыми для компиляции, выполнения и тестирования в следующем формате:
INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ MyProject ---
[INFO]
[INFO] The following files have been resolved:
[INFO] org.netbeans.api:org-openide-filesystems:jar:RELEASE80:compile
[INFO] org.netbeans.api:org-netbeans-modules-queries:jar:RELEASE80:compile
[INFO] org.netbeans.api:org-netbeans-api-progress:jar:RELEASE80:compile
[INFO] org.netbeans.api:org-openide-dialogs:jar:RELEASE80:compile
[INFO] org.apache.derby:derby:jar:10.11.1.1:compile
[INFO] org.netbeans.api:org-openide-windows:jar:RELEASE80:compile
Единственное требование заключается в том, что компиляция завершена. Это не работает, если компиляция не запускается.
Другая команда это команда mvn dependency:tree
,
В ответ Джаника добавлен недостающий аргумент для области видимости. Теперь все готово. Добро пожаловать.
mvn -q exec:exec -Dexec.classpathScope="compile" -Dexec.executable="echo" -Dexec.args="%classpath"
Это решение для одной команды, но оно компилирует код.
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}'
- Он основан на предыдущем ответе Philip Helger (кстати, спасибо)
Пример использования сценария оболочки
MAVEN_CLASSPATH=$(mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}')
Я использовал его вариант в сценарии оболочки для запуска автономной функции main() (для генерации схемы Hibernate).
#/bin/bash
MAVEN_TEST_CLASSPATH=$(mvn -e -X clean package | grep -o -P '\-classpath .*?test.*? ')
java $MAVEN_TEST_CLASSPATH foo.bar.DBSchemaCreate
Пример вывода файла
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}' > maven.classpath