我目前有一个像这样设置的 .java 文件:
package com.ds;
class c{...}
public class Main{...}
当我编译文件 Main.java 时,它会生成一个 .class 文件,即 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 至少默认情况下不会分割文件中的类?我知道许多 IDE(例如 Eclipse 和 IntelliJ)将类拆分为两个单独的 .class 文件(我可以确认这一点)。那么javac有什么办法可以做到这一点吗?我使用 javac 作为 IntelliJ 的编译器,所以必须有一种方法,除非它在编译之前完成。
如果我删除这个包,我就可以完美地运行 java Main,只需要编译一个 .class 文件。所以我有点迷茫,也有点绝望。我试图完全避免更改我的代码或将类拆分为两个单独的 .java 文件。
我不确定你做错了什么,所以我只会向你展示如何做到这一点。
假设您有目录和文件
[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.class
和 Main.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
文件的代码)
使用 -d 选项指定生成的类文件的放置位置。 例如。如果您想将其编译到提示符所在的当前目录,请使用
javac -d . Main.java
它将在您当前目录中创建文件夹结构 com/ds 并将两个类文件放入其中。 然后运行使用
java com.ds.Main