В Maven, как выводить используемый classpath?

Для моих текущих целей у меня есть проект Maven, который создаетwar файл, и я хочу увидеть, какой фактический путь к классу он использует при созданииwar, Есть ли способ сделать это в одной команде - без необходимости компилировать весь проект?

Одна идея состоит в том, чтобы Maven генерировалtarget/classpath.properties файл, а затем остановиться в этой точке.

 weima20 нояб. 2017 г., 10:29
это должно быть основным требованием к Maven. но я уверен, что они не согласятся.

Ответы на вопрос(6)

Эторешение одной команды нокомпилирует код

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
 ElMesa21 дек. 2016 г., 17:28
Протестировано прямо сейчас на Mint 18 (на основе Ubuntu 16.04) и работает: O. Не могли бы вы предоставить консольные ответы дляuname -a а такжеmaven --version ? На тестируемой системе с успешными результатами $ uname -a -> "Linux ******* 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux", $ mvn --version -> "Apache Maven 3.3.9; Java version: 1.8.0_111, vendor: Oracle Corporation; OS name: 'linux', version: '4.4.0-21-generic', arch: 'amd64', family: 'unix'
 David Georg Reichelt20 дек. 2016 г., 15:19
В maven 3.3.9 ваша команда grep ничего не возвращает (к сожалению, я не вижу ни одного пути к классам при работе с -e -X). Есть ли обновление этого решения?
 ElMesa21 дек. 2016 г., 17:32
Обратите внимание, что если вы не в Linux, grep может отсутствовать в вашей системе (как в Windows) или может вести себя по-другому (как в macos для некоторой комбинации опций). Если вы находитесь на Windows, вы можете попробовать Cygwin или MinGW, чтобы иметь grep, но я нене знаю, если выУ вас будут проблемы, похожие на macos, где Cygwin или MinGW могут вести себя иначе, чем тот, который используется в пакетах Ubuntu 16.04. (если вы используете Windows и нашли подход MinGW или Cygwin, пожалуйста, дайте мне знать, чтобы обновить ответ)

Команда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 dependency:build-classpath -Dmdep.outputFile=cp.txt

Или добавьте это в POM.XML:


  [...]
  
    
      
        org.apache.maven.plugins
        maven-dependency-plugin
        2.9
        
          
            build-classpath
            generate-sources
            
              build-classpath
            
            
              
            
          
        
      
    
  
  [...]

От:http://maven.apache.org/plugins/maven-dependency-plugin/usage.html

 ecerulm27 окт. 2017 г., 17:53
mvn dependency:build-classpath будет по умолчанию выводить classpath дляtest область зависимости который включает в себя , , ,systemprovidedcompileruntime а такжеtest, Если вы хотите получить classpath дляcompile или жеruntime прицелы. Ты можешь использовать-Dmdep.includeScope=compile
 Pavel S.16 мая 2018 г., 12:12
@ecerulm Спасибо, чтоЭто очень ценная деталь. Но-DincludeScope=compile работал на меня вместо. Я-Dmdep.includeScope
 Pavel S.16 мая 2018 г., 12:38
мы добавили дополнительныйответ ниже это позволяет указать желаемый объем.
 pmakholm07 авг. 2018 г., 14:26
В моем сценарии использования я хотел, чтобы classpath печатался на stdout без необходимости связываться с временными файлами. Это работает:mvn dependency:build-classpath -Dmdep.includeScope=runtime -Dmdep.outputFile=/dev/fd/4 4>&1 >/dev/null

Эта командавыходы путь к классам на 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 сообщений об ошибках при сбое вашей программы.

 Danila Piatov12 июл. 2017 г., 00:15
Он выводит classpath, а не сохраняет его в файл.
 iehrlich11 июл. 2017 г., 22:46
Как это лучше, чем принятый ответ на этот вопрос?

Какecerulm отметил в своем комментарии кЯник»ответВы можете указать область действияdependency:build-classpath, поскольку выход classpath будет отличаться для разных областей (по умолчаниюtest используется по какой-то причине). Я'В итоге мы получили такую команду:

mvn -DincludeScope=compile dependency:build-classpath

Внутри POM его можно использовать так:


  [...]
  
    
      
        org.apache.maven.plugins
        maven-dependency-plugin
        2.9
        
          
            build-classpath
            generate-sources
            
              build-classpath
            
            
              compile
              
              ${project.build.directory}/compile-classpath.txt
            
          
          
            build-test-classpath
            generate-test-sources
            
              build-classpath
            
            
              test
              
              ${project.build.directory}/test-classpath.txt
            
          
        
      
    
  
  [...]

Это выведет 2 версии classpath, одну для основной сборки и другую для тестов.

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

 Philip Helger20 мая 2013 г., 20:48
отладочная информация содержит полный путь к классам для каждого подключаемого модуля жизненного цикла (включая другие)
 Alexander Bird20 мая 2013 г., 20:06
Я неНе думаю, что это решает проблему, потому что отображение ошибок и отладочной информации неt помочь вывести используемый путь к классам.
 ElMesa31 мая 2016 г., 18:31
Спасибо, сэр, я написал итерацию по вашему решению, не стесняйтесь повторно использовать любое из него, если вы сочтете это полезным для будущего читателя, потому что сейчас мой ответ:внизу и мало кто будет читать это (stackoverflow.com/a/37551032/2265487)

Ваш ответ на вопрос