web-dev-qa-db-ja.com

Mavenから、src / test / javaの下にあるクラスをどのように実行しますか?

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

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

私が持っている最も近いものは:

_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つのスコープを指定する必要があるかのようですが、 "test、compile"を受け入れません。

私がこれを継承した人(ほとんど出発していません)は、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)
_
45
woddle

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

悪くありませんが、再現できません。私はプロジェクトを作成しました:

 $ mvn archetype:generate -DgroupId = com.stackoverflow\
 -DartifactId = Q4060613\
 -Dversion = 1.0-SNAPSHOT\
 -DarchetypeArtifactId = maven-archetype -クイックスタート 

次に、cdedして、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 test 
 ... 
 $ mvn exec:Java -Dexec.mainClass = "com.stackoverflow.Demo" -Dexec.classpathScope = "test" 
 [INFO]プロジェクトをスキャンしています... 
 ... 
 [INFO] --- exec-maven-plugin:1.2:Java(default-cli)@ Q4060613 --- 
横糸!
 [情報] ------------------------------------------ ------------------------------ 
 [INFO] BUILD SUCCESS 
 [INFO]- -------------------------------------------------- -------------------- 
 ... 

他の何かが間違っているに違いありません。

21
Pascal Thivent

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メソッドを含むクラスです。

21
Jeevan Adiga

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

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

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

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

$ mvn -Dexec.mainClass=... -Dexec.classpathScope=test clean exec:Java
18
Jin Kwon

さて、他のみんなのために働いていたので、もう少し懸命に掘りました。コードは問題を十分に報告しておらず、スタックトレースを誤って読みました。

します:

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

失敗していた。私はtrunk/src/main/Assembly/lib /をtrunk /にシンボリックリンクしましたが、現在は機能しています。しかし、シンボリックリンクを修正するより良い方法があるかもしれません。

チャップスありがとうございます。

0
woddle