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

时间:2013-10-06 18:54:00

标签: java class compiler-construction intellij-idea runtimeexception

我目前有一个.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文件。

2 个答案:

答案 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.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

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

答案 1 :(得分:0)

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

javac -d . Main.java

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

运行
java com.ds.Main