mvn exec: Java неправильно устанавливает classpath

1

Я пытаюсь запустить программу 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>
  • 0
    Пожалуйста, покажите полную ставку, иначе невозможно помочь. Кроме того, было бы полезно, какую версию Maven вы используете? Какая версия exec-maven-plugin? и т.п.
  • 0
    Я обновил свой вопрос версией POM и Maven, спасибо.
Показать ещё 1 комментарий
Теги:
maven

2 ответа

1

Я не знаю о 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
....

Вы должны увидеть много сообщений "Добавить проект артефакта зависимостей".

0

По умолчанию exec: java использует область "runtime", которая не будет приводить ваши зависимости в область "компиляция".

Вы можете использовать:

exec:java -Dexec.classpathScope="compile"

Чтобы включить зависимости от компиляции (не на 100% уверены в синтаксисе -D, но переменная exec.classpathScope наверняка).

Это должно сделать трюк. Если вам нужна дополнительная информация/параметры, на странице плагина есть несколько вариантов: http://mojo.codehaus.org/exec-maven-plugin/java-mojo.html

  • 0
    Я попытался запустить mvn exec:java -Dexec.classpathScope="compile" , но проблема все еще остается. Я также попытался -Dexec.includeProjectDependencies=true и -Dexec.includePluginsDependencies=true но ни один из них не дал никакого эффекта.
  • 0
    includeProjectDependencies и includePluginsDependencies не нужны. Как бы то ни было, classpathScope должен иметь (как минимум) еще одну проблему. Вы пробовали «mvn dependency: tree», чтобы понять, откуда возникает зависимость сплетения?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню