【问题标题】:java.class files directory structure same as source files?java.class 文件目录结构与源文件相同吗?
【发布时间】:2015-10-21 06:33:36
【问题描述】:

目前我通过以下步骤从 src 文件到 jar 进行一些运行时编译:

首先:在一个目录和子目录中生成源文件

/main    
  /submain1
  /submain2 

第二步:编译代码(目前所有.class文件都进入这个目录)

 /builddir

第三:从.class文件生成jar到目标文件夹

 /target

编译由 Java ToolProviders Javacompiler 完成

ArrayList<File> files1 =  getSourceFiles();
Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(files1);
JavaCompiler.CompilationTask task = compiler.getTask(null ,fileManager , null, optionList, null, compilationUnits1 );
boolean compiled = task.call();

现在我的第一个问题是,将所有 .class 文件分成不同的编译单元并重建与源文件相同的目录结构会更好吗?

如果是这样,怎么做?

【问题讨论】:

  • 我很惊讶你能在没有具有相同结构的情况下让它工作(如果你能工作的话)。
  • 你吓到我了……但是这个罐子是成功创建的。但它并没有经过严格的测试,因为一些必需的组件还没有实现。

标签: java jar build .class-file


【解决方案1】:

现在我的第一个问题是,将所有 .class 文件分成不同的编译单元并重建与源文件相同的目录结构会更好吗?

.class 文件的输出结构必须反映源文件中使用的包名称。源文件的 AFAIK 文件夹结构并不重要。

如果您在 .jar 文件中使用任何其他结构,类加载器将无法找到类。

所以你的问题的答案是

【讨论】:

    【解决方案2】:

    Java 期望 foo.bar.MyClass 可以在 foo/bar/MyClass.class 找到(还有一些额外的类路径相关要求),否则你会得到 ClassNotFoundExceptions(或者是 NoClassDefFoundErrors)。

    因此,您不仅应该具有相同的结构,而且您必须具有相同的结构。我不知道你为什么要这样编译,而不是使用现有的构建工具,默认情况下会生成正确的结果。

    创建 jar 文件等同于创建 zip 文件,因此正如编译成功并不意味着您的程序可以工作,拥有 jar 文件也不意味着它可以工作。

    【讨论】:

    • 运行时需要编译java代码。所以我们的选择是以编程方式使用 jdk 提供的 JavaCompiler。如果您有其他(更好的)建议,我愿意接受任何建议。
    • 啊,我没有意识到你在运行时这样做了。
    • 也可以在 java 上下文之外执行命令行或外部工具进行编译,但我更喜欢留在 java 上下文中
    • 从技术上讲,如果您使用自定义类加载器,您可以对类文件执行任何操作。
    • @Antimony 你说的任何东西除了...任何东西是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多