2016-08-15 95 views
1

如何通過maven執行SampleFlowTest.java如何通過maven運行java文件?

裏面的代碼SampleFlowTest.java是:

package com.myname.module.test; 

import com.myname.partA.something; 
import java.util.Scanner; 
import java.util.ArrayList; 

public class SampleFlowTest { 
    public static void main(String[] args) { 
     // something I want to execute 
    } 
} 

文件樹如下所示。

. 
├── pom.xml 
├── resource 
│   ├── fileA.txt 
│   └── fileB.txt 
├── src 
│   ├── main 
│   │   └── java 
│   │    └── com 
│   │     └── myname 
│   │      ├── partA 
│   │      │   └── Aaa.java 
│   │      ├── partB 
│   │      │   ├── B.java 
│   │      │   ├── Bb.java 
│   │      │   └── Bbb.java 
│   │      └── module 
│   │       ├── M1.java 
│   │       └── M2.java 
│   └── test 
│    └── java 
│     └── com 
│      └── myname 
│       ├── partA 
│       │   └── test 
│       │    └── AaaTest.java 
│       ├── partC 
│       │   └── service 
│       │    └── test 
│       │     ├── BTest.java 
│       │     └── BbbTest.java 
│       └── module 
│        └── test 
│         └── SampleFlowTest.java 
└── target 
    ├── classes 
    │   ├── com 
    │   │   └── myname 
    │   │    ├── partA 
    │   │    │   └── Aaa.class 
    │   │    ├── partB 
    │   │    │   ├── B.class 
    │   │    │   ├── Bb.class 
    │   │    │   └── Bbb.class 
    │   │    └── module 
    │   │     ├── M1.class 
    │   │     └── M2.class 
    │   └── somefile.txt 
    └── test-classes 
     ├── com 
     │   └── myname 
     │    ├── partA 
     │    │   └── test 
     │    │    └── AaaTest.class 
     │    ├── partC 
     │    │   └── service 
     │    │    └── test 
     │    │     ├── BTest.class 
     │    │     └── BbbTest.class 
     │    └── module 
     │     └── test 
     │      └── SampleFlowTest.class 
     └── module.properties 

我試過了,就像Maven: How to run a .java file from command line passing arguments說過,但它仍然不起作用。

我執行mvn exec:java -Dexec.mainClass=com.myname.module.test.SampleFlowTest,併發生錯誤,結果的一部分是:

[WARNING] 
java.lang.ClassNotFoundException: com.myname.module.test.SampleFlowTest 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:281) 
    at java.lang.Thread.run(Thread.java:745) 

應該比我執行mvn exec:java -Dexec.mainClass=com.myname.module.test.SampleFlowTest其他什麼命令?

+0

我認爲'mvn exec'不會查看你的測試類路徑。爲什麼你的測試類是'main'方法?你想運行你的單元測試嗎? – Schrieveslaach

回答

2

SampleFlowTest.java運行目標test-compile應該在src/main/java樹。

  • src/test/java爲單元和集成測試類。

  • src/main/java是用於您的應用程序的類。

SampleFlowTest不是測試類,因爲它包含一個static void main(String[] args)方法。 測試類應包含斷言,但您的類不包含它們。 相反,它包含用於啓動應用程序的機制:static void main(String[] args)

MVN高管:JAVA

是正在運行的程序。所以,默認情況下,我想它會搜索src/main/java中的執行類exec.mainClass

如果您不想更改佈局,則可以配置exec:java目標以使用另一個作用域作爲源作用域。

mvn exec:java -Dexec.mainClass=com.myname.module.test.SampleFlowTest -Dexec.classpathScope="test" 
+0

請停止從我的答案複製!如果不通過'mvn test'或'test-compile'編譯測試,你的命令將不起作用。 – Rocherlee

+0

我沒有複製任何東西,因爲我沒有提到你的命令。你已經告訴過你自己。 所以,請冷靜下來。我編輯了我的答案,以帶來精度。他們與你的迴應沒有任何關係。 – davidxxx

+0

根據是否需要編譯測試類,您是否適合'mvn test'。如果你使用IDE,它應該沒用。與你相反,我解釋了問題的原因。在第一部分中,我將討論它的代碼佈局,這不是非常傳統的。之後,我討論如何繞過這個。我編輯繞過,但它與您的帖子沒有任何關係。這需要時間,對不起,但它有助於人們瞭解問題,並提出如何繞過而不提供解釋更有幫助。 – davidxxx

2

這是因爲exec:java/src/test

編譯測試您需要exec:java

mvn test-compile exec:java -Dexec.mainClass=com.myname.module.test.SampleFlowTest -Dexec.classpathScope=test 
+0

'exec:java'什麼都不編譯。這是運行程序類的目標。 默認情況下,在默認的'src/main/java'而不是'src/test/java'的項目的Maven sourceDirectory中運行程序類 – davidxxx

+0

我的意思是'exec:java'目標不映射到編譯測試的任何默認maven階段。所以只運行它不會編譯'/ src/test'中的測試。 – Rocherlee

0

在您的測試類使用註釋@Test上面要運行的方法:當你以這種方式運行命令,可以通過設置屬性exec.classpathScope做到這一點。 此註釋來自「org.junit.Test」。然後去終端,進入項目路徑。就像如果你的Maven項目名稱是「SampleApp」並且它的路徑是「X」。 然後轉到終端中的「/ X/SampleApp」。然後執行命令「mvn clean install」,它將運行您在「/ src/test ..」中編寫的所有測試用例。

要運行單個測試或測試類,請參閱this鏈接。