-2

我目前有一个像这样设置的 .java 文件:

package com.ds;

class c{...}

public class Main{...}

当我编译文件 Main.java 时,它会生成一个名为 Main.class 的 .class 文件。

当我尝试使用它运行 .class 时,java com.ds.Main它不起作用!它说它找不到或加载类。

当我尝试运行 .class 时,java Main它会运行,但出现如下错误:

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

2 回答 2

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目录并从中使用

我的项目>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并像这样运行它

我的项目>java -cp classes com.DatingService.Main

(注意:类后没有.java后缀,Main因为 JVM 运行的是存储在.class文件中的二进制文件,而不是文件中的代码.java

于 2013-10-06T19:49:45.793 回答
0

使用 -d 选项指定放置生成的类文件的位置。例如。如果要将其编译到提示所在的当前目录,请使用

javac -d . Main.java

它将在您当前目录中创建文件夹结构 com/ds 并将两个类文件放在那里。然后运行使用

java com.ds.Main
于 2013-10-06T19:19:04.563 回答