В 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, один для основной сборки, а другой для тестов.