В Maven, каким образом используется путь к классам?
В моих текущих целях у меня есть проект Maven, который создает файл war
, и я хочу посмотреть, какой фактический путь он использует при создании war
. Есть ли способ сделать это в одной команде - без компиляции всего проекта?
Одна идея состоит в том, чтобы Maven сгенерировал файл target/classpath.properties
, а затем остановился в этой точке.
Ответы
Ответ 1
Чтобы получить путь к классу отдельно в файле, вы можете:
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
Ответ 2
или вызовите "mvn -e -X...." и проверьте вывод...
Ответ 3
Команда mvn dependency:list
будет перечислять путь к классу со всеми баночками, используемыми для компиляции, времени выполнения и теста в следующем формате:
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
.
Ответ 4
Эта команда выводит путь к классам на Mac и Linux:
mvn -q exec:exec -Dexec.executable=echo -Dexec.args="%classpath"
Результат, напечатанный и не сохраненный в файле, может быть полезен, например, при назначении результата переменной в Bash script. Это решение работает только на Mac и Linux, но так же Bash shell-скрипты.
В Windows (например, в BAT файлах), где нет исполняемого файла echo
, вам понадобится что-то вроде этого (untested):
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 добавляет свои сообщения об ошибках, когда ваша программа выходит из строя.
Ответ 5
Это единственное командное решение, но выполняет компиляцию кода.
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}'
Использование оболочки script
MAVEN_CLASSPATH=$(mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}')
Я использовал его вариант в оболочке script для запуска автономного 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
Ответ 6
Как ecerulm отметил в своем комментарии к Janik ответа, вы можете указать область для dependency:build-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, один для основной сборки, а другой для тестов.