![](/img/trans.png)
[英]Java class is present in classpath but startup fails with Error: Could not find or load main class
[英]Java “could not find or load main class” with classpath error
在Java中使用-cp或-classpath標志進行編譯時,我遇到了一個問題。 我將嘗試解釋下面的問題:
我們說吧; 我有兩個文件 - A.java和B.java。 A.java有一個簡單的公共類,它有一個私有實例變量,一個get和一個set方法。 B.java是A的驅動方法。它實例化A; 為A的實例變量設置一些值,最后使用A中的get方法打印出該值。
我可以從命令行編譯A.java和B.java。 如果兩個編譯的類文件都在同一個文件夾中; 以下運行正常:
java B
然而; 說我把A.class保存在一個單獨的文件夾中。 甚至更好; 我創建了一個類文件A.class的JAR文件。 現在; 我應該能夠使用正確陳述的類路徑編譯B.java。
編譯工作。
javac -cp ..\\Lib\\A.jar -d ..\\Bin B.java
它按預期將B.class文件放在Bin文件夾中。 現在; 如果我去Bin文件夾並嘗試執行以下操作;
java -cp ..\Lib\A.jar B
我收到錯誤:
Error: Could not find or load main class B
現在; 過去幾天我一直試圖解決這個問題。 這是一個簡單的用例來演示這個問題; 但實際上 - 我無法使用-classpath或-cp標志鏈接到現有的JAR庫。 我可以從命令行運行Java程序的唯一方法是從JAR存檔中提取類文件與輸出類在同一目錄中。 那么,我就不需要在執行命令中包含classpath標志。
但這是我不想要的。 我想將我的JAR存檔與源代碼的輸出類文件分開。 我知道使用IDE; 這是我不需要擔心的事情。 但我對命令行解決方案更感興趣; 了解引擎蓋后面的內容。
我已經對StackOverflow上的所有其他建議進行了討論 - 但似乎沒有任何建議。 僅供參考,我在所有情況下都使用默認包。 沒有明確指定包裝。
請幫忙。 提前致謝!
更新:我被要求以可讀格式提供我的目錄結構,所以這里是:
$pwd
C:\My\Path\To\Java\Programs\Top
$ls
Source
Bin
Lib
$cd Bin
$ls
B.class
$ls ..\Source\
A.java
B.java
$ls ..\Lib
A.jar
$jar tf ..\Lib\A.jar
META-INF
META-INF/MANIFEST.MF
A.java
A.class
我希望能夠清除它。 我使用的是Windows Powershell,因此子目錄標有“\\”。 如果我在Unix終端中輸入,那么它將是“/”。 順便說一句,我在Ubuntu 14.04上試過這個,但沒有用。 我也用jdk 1.6到jdk 1.8進行了測試 - 同樣的錯誤。
在嘗試運行程序時,您錯過了“類路徑”。
有人誤以為“-cp .. \\ Lib \\ A.jar”是在運行時包含A.class。 但問題是,“-cp”選項是設置類路徑而不包括。 這樣就缺少了類“B”的類路徑。
因此,要運行程序,從“Bin”文件夾,正確的命令(對於任何Windows系統)是:“java -cp。; .. \\ Lib \\ A.jar B”。 “。” 使用當前目錄,完全不同。
對於Linux,來自“Bin”文件夾的命令變為:“java -cp。:../ Lib / A.jar B”。
主要區別在於分隔符,“ ; ”用於Windows,“ : ”用於Linux。
而不是以下:
java -cp .. \\ Lib \\ A.jar B.
提供這個
java B -cp .. \\ Lib \\ A.jar
謝謝,
Aritra
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.