-3

我現在有一個.java文件設置是這樣的:單編譯java文件有兩個班分爲兩個.class文件

package com.ds; 

class c{...} 

public class Main{...} 

當我編譯文件Main.java,它導致單。類文件是Main.class。

當我嘗試使用java com.ds.Main運行.class時,它不起作用!它說它無法找到或加載課程。

當我嘗試用它運行java Main運行的.class,但我得到一個錯誤,像這樣:

Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: com 
/DatingService/Main) 


at java.lang.ClassLoader.defineClass1(Native Method) 

at java.lang.ClassLoader.defineClass(ClassLoader.java:792) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482) 

我見過這之前,同時試圖找到解決方案的解決方案,沒有我發現適用於我或只是沒有工作。

在做了一些更多的研究後,我假設javac不會將文件中的類至少默認分割出來?我知道許多像Eclipse和IntelliJ這樣的IDE將類分成兩個獨立的.class文件(我可以證實這一點)。那麼有沒有辦法讓javac來做到這一點?我使用javac作爲IntelliJ的編譯器,所以必須有一種方法,除非在編譯之前完成。

如果我刪除了軟件包,我可以運行java Main,只需編譯一個.class文件即可。所以我有點困惑,有點絕望。我試圖完全避免更改我的代碼或將這些類拆分爲兩個單獨的.java文件。

+4

這個問題似乎是題外話,因爲它是關於將是興趣不大,未來民衆的當務之急。 –

+1

它是錯字還是真的,你的包是'com.ds',而'Main'類是在'com/DatingService'裏面?無論如何,我不能重現你的錯誤。如果我在'MyPublicClass.java'文件中有兩個類(一個公共),那麼如果使用'javac MyPublicClass.java'編譯,則會得到兩個'class'文件。 – Pshemo

+0

真正的包名是com.DatingService,我簡單地縮短了它的例子。它們都在同一個.java文件中的相同包中。他們編譯得很好,但我無法運行它。有沒有特殊的方式來運行這樣的事情? java com.DatingService.Main不工作,因爲我上面說過 – AaronDancer

回答

1

我不知道你在做什麼錯,所以我只會告訴你如何是可以做到的。

比方說你有目錄和文件

[myProject] 
    | 
    +--[src] 
    | | 
    | +--[com] 
    |  | 
    |  +--[DatingService] 
    |   | 
    |   +-- Main.java 
    | 
    +--[classes] 

和你的Main.java文件看起來像

package com.DatingService; 

class c{ 
    private int i; 
    public void setI(int i){ 
     this.i=i; 
    } 
    public int getI(){ 
     return this.i; 
    } 
} 

public class Main{ 
    public static void main(String[] args){ 
     c myCVariable = new c(); 

     myCVariable.setI(10); 
     System.out.println(myCVariable.getI()); 
    } 
} 

在終端,你需要去myProject目錄,並用它

myProject>javac -d classes src\com\DatingService\Main.java

感謝-d(目錄)具有所有已編譯類的參數包應放置在classes目錄中(請注意,classes目錄必須已經存在)。所以c.classMain.class將被放置在myProject\classes\com\DatingService

現在要運行main方法Main類,您只需提供有關包含您的包的目錄(這是ClassPath)的信息,也可以使用full.package.name.to.your.MainClass。所以,你必須添加-classpath classes(或更短-cp classes)參數的java命令並運行它像

myProject的>java -cp classes com.DatingService.Main

(注:沒有後綴後Main.java類,因爲JVM運行存儲在二進制文件.class文件,而不是從.java文件中的代碼)

+0

這個伎倆!非常感謝你的解釋!它現在很有意義。 非常感謝您的幫助:) – AaronDancer

+0

沒問題。很高興我能幫上忙。 – Pshemo

0

使用-d選項指定放置生成的類文件的位置。例如,如果你想將它編譯到當前目錄下你的提示是,使用

javac -d . Main.java 

它會在你當前目錄下創建文件夾結構COM/DS和放置在有兩個類文件。 然後運行使用

java com.ds.Main 
+0

我不知道爲什麼,但使用該目錄的'.'的時候,但是如果我改變,要什麼我仍然得到異常,這樣的伎倆。此外,我不能在我的文件結構得到這個工作,只有當我把JDK中的bin文件夾 – AaronDancer

+0

中的.java如果指定'-d東西,別人的到的javac,你必須指定'-classpath東西,別人的到Java 。 – EJP