-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