簡體   English   中英

即使存在主類,Java 也找不到主類

[英]Java cannot find main class even though main class is present

我一直在嘗試運行一個 jar,但我不斷收到錯誤消息:

Error: Could not find or load main class com.myclass
Caused by: java.lang.ClassNotFoundException: com.myclass

這非常令人困惑,因為我提取了 jar 並且該類存在於正確的位置。 這就是我使用 gradle 編譯 jar 的方式:

jar {
  manifest {
    attributes 'Main-Class': 'com.myclass'
  }

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

我相信這是 java 的問題,因為 jar 文件似乎是正確的。 有誰知道我該如何解決這個問題?

您的問題不包含任何會直接表明您做錯了什么的細節。

但我可以告訴你一般原則:

解壓那個 jar(它是一個 zip 文件,所以任何解壓縮器都可以。或者,新創建的目錄中的jar xvf myjar.jar也可以完成這項工作)。

其中,應該至少有 2 個文件,位於以下確切位置:

  • com/foo/MyClass.class
  • META-INF/MANIFEST.MF

然后,用記事本打開清單文件或從終端cat它。 它應該包含這一行,再次,正是

  • Main-Class: com.foo.MyClass

如果這些都是真的,但您在這個問題中報告的錯誤正在發生,那么我們就遇到了真正奇特的東西,例如損壞的 VM 或損壞的類文件。 您更有可能誤讀了某些內容,請仔細檢查名稱。

注意:如果您忘記向類添加正確簽名的“main”方法,則錯誤是不同的,因此,不是這樣。

對於它的價值,本節:

   from {
     configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
   }

看起來不標准。 是否有任何特別的事情你試圖讓你的 gradle 構建文件沒有內置到默認值中? 在這種情況下,您可能做錯了; 您可能想專門詢問另一個 SO 問題,並將這部分(特別是您對清單中的內容以及類文件實際位於 jar 文件中的位置的發現)作為該問題的腳注。

包裹是強制性的。 未命名包中的東西(當類沒有包語句時會發生這種情況)實際上仍然在一個包中,但它是一個你不能輸入的包。 唯一的例外是在運行java -cp classpath;here myclass通過異常的方式工作。 關鍵是,它在任何清單屬性中都不起作用,您根本無法導入它們,並且它們在模塊信息文件中也​​不起作用(即,在其他任何出現類名的地方,未命名包中的類只是不能參考)。

因此,添加一個 package 語句並在與此匹配的子目錄中移動內容。

通常,當您使用 Eclipse IDE 時,編譯器也會使用包名稱拋出此錯誤。 嘗試在特定包內使用 main 方法打包類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM