2011-07-30 97 views
0

幸運的是,我從來沒有在命令行中調用java太多的工作,直到現在,我通常使用類似Maven,Ant或者在servlet容器中運行的東西。我剛剛使用匯編:單個目標將我的Maven應用程序編譯成一個JAR,並從命令行運行嚴重問題。Java Classpath Woes

這裏就是我試圖做的事:

export JAVA_CLASSPATH="`pwd`:/path/to/remote/libs/" 
java -cp "${JAVA_CLASSPATH}" -jar groupId-artifactId-version-jar-with-dependencies.jar com.my.main.Class 

這與下面的錯誤而失敗:

Exception in thread "main" java.lang.NoClassDefFoundError: com/remote/lib/IServer 
Caused by: java.lang.ClassNotFoundException: com.remote.lib.IServer 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
Could not find the main class: com.my.main.Class. Program will exit. 

IServer類是/path/to/remote/libs目錄並沒有被發現。它似乎也無法找到主要的課程,這很奇怪。我究竟做錯了什麼?

+0

IServer.class文件存儲在哪裏?在path/to/remote/libs的最上層?它可能需要位於/ path/to/remote/libs/com/my/main – Marvo

回答

2

@ Kal的答案是正確的,但一個簡單的方法來解決它會是這樣:

export JAVA_CLASSPATH="groupId-artifactId-version-jar-with-depencies.jar:`pwd`:/path/to/remote/libs/iserver.jar" 
java -cp "${JAVA_CLASSPATH}" com.my.main.Class 

無需與清單文件進行修補;只需將你想要的jar添加到classpath即可。

此外,如果IServer的東西在/path/to/remove/libs/裏面的jar裏,那麼你需要明確地包含jar文件的名字。我已經將它包含在上面,並假設它被稱爲「iserver.jar」

如果您有很多依賴關係,那麼編寫用於啓動代碼的shell腳本通常會更容易。該腳本可以使用shell glob善良構建一個(可能非常大的)類路徑字符串。 java可執行文件不會做任何通配符。

編輯:請注意,我假定你訪問Ant或Maven或任何的好東西,因爲你說,你平時使用這些工具,但不這樣做是正確的了。

0

必須使用jar文件的確切路徑指定classpath參數。例如,如果在server.jar中找到IServer類,則需要指定"$pwd\:/path/to/remote/libs/server.jar"。 (換句話說,你需要包括路徑: - 分隔列表,JAR文件)

正如其他人所指出的,如果你選擇這個方法,你應該刪除-jar參數,而是包括你打算要在類名您的命令行上的主要類,如java -cp $PWD:/path/to/server.jar com.remote.lib.IServer

備註:通常以I開頭的名稱是爲接口保留的;使用接口作爲主類似乎有點奇怪。

+0

已使用'-jar'參數。然後'-cp'和'-classpath'將被忽略。擺弄路徑值不會改變這一點。 – BalusC

+0

@BalusC,已更新以反映其他選項,謝謝 – mpontillo

4

-jar選項會忽略類路徑(以及所有其他)選項。

您需要在jar中編輯清單文件並在其中設置Class-path變量。

http://download.oracle.com/javase/1.4.2/docs/tooldocs/linux/java.html

+0

我相信有一種方法可以將Maven配置爲生成適當的Manifest文件並將其包含在JAR中。不幸的是,我只用了很多次Maven,我不記得如何。我會建議檢查Maven文檔。 –