2016-05-26 33 views
1

我有一個使用Maven「quickstart」模板構建的java項目。該結構看起來像Maven:使用命令行運行java類文件

src 
    main 
    java 
     myapp 
     HelloWorld.java 

的HelloWorld.java被宣佈爲下包 「的myapp」

內的pom.xml,只有JUnit是包括在內。

現在,當我運行Maven編譯,我得到

target 
    classes 
    myapp 
     HelloWorld.class 

但在我的CD下一個類文件到目標/班/ MyApp的,做

java -cp . HelloWorld 

我得到的NoClassDefFoundError,我根據How to execute a java .class from the command line

我試圖

java -cp . myapp.HelloWorld (myapp is the package) 
做到了

我仍然得到「無法找到或加載主類」

我的問題是:「-cp」我設置使用類路徑,那麼爲什麼還是不能運行的類?它與Maven有什麼關係?

我知道我不需要使用命令行,我只是好奇。

+0

我假設你需要指定包的名稱 - 即去target/classes並運行java -cp。 myapp.HelloWorld' – stdunbar

+0

@PetterFriberg,我讀到了所有這些問題,但解決方案對我來說不起作用,這就是爲什麼我會問這個問題,並且我知道這個問題有很大的變化。我只希望有人花3分鐘時間來重現它,我對這個似乎很簡單的問題感到非常沮喪。 – user2628641

+2

問題就像在鏈接問題中:你需要小心包裝聲明。 'HelloWorld'是'myapp'包下的一個類。所以要運行它,你必須不**把'cd'變成'myapp'。你應該把'cd'到這裏的'target/classes'的根文件夾並調用'java myapp \ HelloWorld'。也就是說,最好讓你的項目(Maven在'target下默認創建的)創建一個JAR,'cd'給basedir並用'java -jar target \ name-of- jar.jar' – Tunaki

回答

3

-cp。向Java表明您希望它在當前目錄中查找類。爲了使這項工作,你需要使用:

java -cp target/classes myapp.HelloWorld 

(注意「的myapp」是你的HelloWorld類定義在包,並宣佈類的第一線,爲

package myapp; 

利用上述java命令,你不需要cd到目標/班/ MYAPP目錄。運行MVN全新安裝,結構的變化後

app/ 
app/pom.xml 
app/src/ 
app/src/main/ 
app/src/main/java/ 
app/src/main/java/myapp/ 
app/src/main/java/myapp/HelloWorld.java 

:如果你想cd到目標/類,你可以使用下面的命令:

java -cp . myapp.HelloWorld 

UPDATE:樣本項目內容

app/ 
app/pom.xml 
app/src/ 
app/src/main/ 
app/src/main/java/ 
app/src/main/java/myapp/ 
app/src/main/java/myapp/HelloWorld.java 
app/target/ 
app/target/classes/ 
app/target/classes/test-1.0.0.jar 
app/target/classes/myapp/ 
app/target/classes/myapp/HelloWorld.class 

編譯後,我能cd到應用程序/目標/班,並運行java命令。 myapp.HelloWorld

如果你仍然遇到麻煩,你可以發佈你的示例類和pom.xml嗎?

+0

我試過了,它不起作用。我的意思是,理論上它應該有效,但我想它與maven有關。你能創建一個簡單的項目並嘗試它嗎? – user2628641

+0

java -cp target/classes myapp.HelloWorld的工作原理,但在我cd然後使用java -cp。 myapp.HelloWorld,它無法加載主類 – user2628641

+0

你在哪裏cd?我剛剛通過一個示例應用程序,並用項目的結構更新了我的答案。 –