В Maven, как выводить используемый путь к классам?
для моих текущих целей у меня есть проект Maven, который создает war
файл, и я хочу увидеть, какой фактический путь к классам он использует при создании war
. Есть ли способ сделать это в одной команде-без необходимости компилировать весь проект?
одна идея состоит в том, чтобы Maven генерировал target/classpath.properties
файл, а затем остановитесь в этой точке.
6 ответов
чтобы получить путь к классам сам по себе в файле, вы можете:
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>
From:http://maven.apache.org/plugins/maven-dependency-plugin/usage.html
эта команда выходы путь к классам на 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
программа с classpath:
mvn -q exec:exec -Dexec.executable=java -Dexec.args="-cp %classpath Main"
или даже так (он будет использовать правильный путь к классам автоматически):
mvn -q exec:java -Dexec.mainClass="Main"
однако оба этих альтернативных подхода страдают от Maven добавления сообщений об ошибках, когда ваша программа терпит неудачу.
команда 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
.
это решение одной команды но компилируется код.
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print }'
- его в Филипп Helgerы ответ (спасибо, кстати)
пример использования сценария оболочки
MAVEN_CLASSPATH=$(mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print }')
я использовал его вариант в сценарии оболочки для запуска автономного 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 }' > maven.classpath
As 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, одну для основной сборки, а другую для тестов.