将具有两个类的单个.java文件编译为两个.class文件[关闭]

问题描述 投票:0回答:2

我目前有一个像这样设置的 .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 文件。

java class intellij-idea runtimeexception
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.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
文件的代码)


0
投票

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

javac -d . Main.java

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

java com.ds.Main
© www.soinside.com 2019 - 2024. All rights reserved.