我目前有一个.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不会将文件中的类拆分至少默认值?我知道像Eclipse和IntelliJ这样的许多IDE将这些类分成两个独立的.class文件(我可以确认一下)。那么javac有没有办法做到这一点?我正在使用javac作为IntelliJ的编译器,因此必须有一种方法,除非在编译之前完成。
如果我删除了包,我只需编译一个.class文件就能完全运行java Main。所以我有点困惑,有点绝望。我试图完全避免更改我的代码或将类拆分为两个单独的.java文件。
答案 0 :(得分: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.class
和Main.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
(注意:.java
类之后没有Main
后缀,因为JVM正在运行存储在.class
文件中的二进制文件,而不是.java
个文件中的代码。
答案 1 :(得分:0)
使用-d选项指定生成的类文件的放置位置。 例如。如果要将其编译到提示符所在的当前目录,请使用
javac -d . Main.java
它将在您当前目录中创建文件夹结构com / ds,并将两个类文件放在那里。 然后使用
运行java com.ds.Main