49

コードベースを継承しました:)

public static void main(String[] args)src/test/java/ の下に、実行する必要があるファイルがあります (その中のメソッドではなく、その を実行する必要があります@Test)。

私が持っている最も近いものは次のとおりです。

mvn -e exec:java -Dexec.mainClass="com.me.packagex.RunFile" -Dexec.classpathScope="test"

しかし、それは失敗し、RunFile が src/main/java/com/me/packagex/ (/test/ ではなく /main/ に注意) の下に存在するクラスを使用したいためと思われます。その下のファイルは、RunFile と同じパッケージ、つまり「package com.me.packagex;」にあります。

を削除すると、-Dexec.classpathScope="test"RunFile がまったく見つかりません。2 つのスコープを指定する必要があるようですが、「テスト、コンパイル」は受け入れられません。

私がこれを受け継いだ (惜しくも亡くなった) 人は、これを Eclipse から実行していました。コマンドラインから実行する方法が必要です。

これが明確に説明されることを願っています。

tyvm、


これは有望です。パスカル、私はあなたの例を試しましたが、うまくいきません。

今見てみると、Dog が見つからないというよりは、Demo が見つからないということです。

Apache Maven 2.2.1 (rdebian-1)
Java version: 1.6.0_18
Java home: /usr/lib/jvm/java-6-openjdk/jre
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-25-generic" arch: "i386" Family: "unix"

$ mvn -e exec:java -Dexec.mainClass="com.stackoverflow.Demo" -Dexec.classpathScope="test"

[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] An exception occured while executing the Java class. com.stackoverflow.Demo

[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: An exception occured while executing the Java class. com.stackoverflow.Demo
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
        at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.MojoExecutionException: An exception occured while executing the Java class. com.stackoverflow.Demo
        at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:346)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
        ... 17 more
Caused by: java.lang.ClassNotFoundException: com.stackoverflow.Demo
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:284)
        at java.lang.Thread.run(Thread.java:619)
4

4 に答える 4

26

私は同じ問題に直面し、それを理解しました。

簡単に言えば、クラスは目標の前にコンパイルする必要があります。 (クラスがすでに他のユーザーアクションによってコンパイルされている場合、フェーズexec:javaなしで確実に機能します。Pascal Thiventは、彼の答えで、前に呼び出されたことに注意してください。)test-compilemvn testexec:java

$ mvn -Dexec.mainClass=... -Dexec.classpathScope=test test-compile exec:java

もう一度見たい場合は、自分で証明できますClassNotFoundException

$ mvn -Dexec.mainClass=... -Dexec.classpathScope=test clean exec:java
于 2015-11-18T13:57:39.457 に答える
22

exec-maven-plugin プラグインの pom.xml に次の行を含めます。<classpathScope>test</classpathScope>

POMのプラグインセクションは次のようになります

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>my-execution</id>
            <phase>test</phase>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <mainClass>com.example.MainClass</mainClass>
            <classpathScope>test</classpathScope>
    </configuration>
</plugin>

注 : com.example.MainClass は、mainメソッドを含むクラスです。

于 2015-06-20T15:45:47.243 に答える
22

(...) これが明確に説明されていることを願っています。

悪くはないのですが再現できません。プロジェクトを作成しました:

$ mvn archetype:generate -DgroupId=com.stackoverflow \
                         -DartifactId=Q4060613 \
                         -Dversion=1.0-SNAPSHOT \
                         -DarchetypeArtifactId=maven-archetype-quickstart

次に、それcdに編集し、Dogクラスを作成しました(下src/main/java):

$ cd Q4060613
$ cat > src/main/java/com/stackoverflow/Dog.java
package com.stackoverflow;

public class Dog {
    public String bark() {
        return "woof!";
    }
}

Demoクラスを作成しました( の下src/test/java):

$ cat > src/test/java/com/stackoverflow/Demo.java 
package com.stackoverflow;

public class Demo {
    public static void main(String[] args) {
        System.out.println(new Dog().bark());
    }
}

ソース コードをコンパイルした後、指定したコマンドを実行すると、期待どおりに動作します。

$ mvn テスト
...
$ mvn exec:java -Dexec.mainClass="com.stackoverflow.Demo" -Dexec.classpathScope="test"
[情報] プロジェクトをスキャンしています...
...
[INFO] --- exec-maven-plugin:1.2:java (default-cli) @ Q4060613 ---
横糸!
[情報]  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - - -------------------------
[情報] ビルド成功
[情報]  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - - -------------------------
...

他に何か問題があるはずです。

于 2010-10-31T05:50:11.637 に答える
1

わかりました、それが他のすべての人のために働いていることに拍車をかけ、私はもう少し一生懸命掘り下げました。コードは問題をうまく報告しておらず、スタックトレースを読み間違えていました。

します:

FileInputStream is = new FileInputStream("lib/other-thing.jar");

これは失敗していました。Trunk/src/main/assembly/lib/ を trunk/ にシンボリックリンクしたところ、動作するようになりました。ただし、シンボリックリンクを修正するためのより適切な方法があるかもしれません。

チャップスありがとう。

于 2010-10-31T07:53:20.700 に答える