Я пытаюсь запустить программу Java с Maven в командной строке, но она не помещает правильные записи в путь к классам. Если я запустил программу в IntelliJ (у которой есть поддержка Maven), у classpath есть 80 или около того записей, включая мои зависимости jar проекта, классы программ компиляции и ресурсы из src/main/resources. Если я запускаю программу с помощью mvn exec:java
, я получаю только одну запись для apache-maven-3.0.4/boot/plexus-classworlds-2.4.jar
. В моем дереве проектов нет ссылок на plexus
. Откуда появляется эта запись и почему другие ожидаемые записи в классе не существуют?
Версия Maven: Apache Maven 3.0.4 (r1232337; 2012-01-17 00:44:56-0800)
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>MyProject</artifactId>
<version>SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- lots of dependencies -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<executable>${env.JAVA_HOME}/bin/javac</executable>
<fork>true</fork>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>${basedir}/src/assembly/assembly.xml</descriptor>
</descriptors>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<mainClass>com.example.MyApp</mainClass>
<executable>${env.JAVA_HOME}/bin/java</executable>
</configuration>
</plugin>
</plugins>
</build>
</project>
Я не знаю о Plexus (я бы предположил, что это зависимость от Exec Maven Plugin?), Но попробуйте запустить с mvn exec:java -X
отладкой: mvn exec:java -X
и должно быть более ясно, что ваши зависимости добавляются к пути к классам:
....
[DEBUG] Invoking : com.example.MyApp.main()
[DEBUG] Plugin Dependencies will be excluded.
[DEBUG] Project Dependencies will be included.
[DEBUG] Collected project artifacts [log4j:log4j:jar:1.2.16:compile, commons-lang:commons-lang:jar:2.6:compile]
[DEBUG] Collected project classpath [C:\MyProject\target\classes]
[DEBUG] Adding to classpath : file:/C:/MyProject/target/classes/
[DEBUG] Adding project dependency artifact: log4j to classpath
[DEBUG] Adding project dependency artifact: commons-lang to classpath
....
Вы должны увидеть много сообщений "Добавить проект артефакта зависимостей".
По умолчанию exec: java использует область "runtime", которая не будет приводить ваши зависимости в область "компиляция".
Вы можете использовать:
exec:java -Dexec.classpathScope="compile"
Чтобы включить зависимости от компиляции (не на 100% уверены в синтаксисе -D, но переменная exec.classpathScope наверняка).
Это должно сделать трюк. Если вам нужна дополнительная информация/параметры, на странице плагина есть несколько вариантов: http://mojo.codehaus.org/exec-maven-plugin/java-mojo.html
mvn exec:java -Dexec.classpathScope="compile"
, но проблема все еще остается. Я также попытался -Dexec.includeProjectDependencies=true
и -Dexec.includePluginsDependencies=true
но ни один из них не дал никакого эффекта.