В 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 сообщений об ошибках при сбое вашей программы.

Или вызовите "mvn -e -X ...." и проверьте вывод...

Как отметил 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}'

Пример использования сценария оболочки

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
Другие вопросы по тегам