【问题标题】:Unable to compile default package class referred in other classes using JavaCompiler [closed]无法使用 JavaCompiler 编译其他类中引用的默认包类 [关闭]
【发布时间】:2024-04-29 07:30:02
【问题描述】:

我遇到需要动态编译类的情况。

以下是我的 java 类的组织结构。

// no package 
public class A{
}

package test ;

public class B{
      A obj;
     //other java code
}

其中 A 是具有默认包的类,B 是具有包名 test 的类。 B 具有 A 作为属性。

文件保存在各自的文件夹中(根据包)

我无法使用 JAVA Compiler API 编译它。

【问题讨论】:

  • 除非您发布代码,否则几乎不可能为您提供帮助。
  • “任何帮助!!”(你有)有什么问题吗?顺便说一句 - 请不要发出信号之类的噪音。
  • 这可能会有所帮助(以及它链接到的文章):*.com/questions/2193226/…
  • 另外,弄清楚如何使用代码格式,并在点击发送之前在预览中检查您的帖子。这是现在我不得不编辑它以提高可读性的两倍。 ..然后你又把它弄坏了,得到了 -1 的刺激值。
  • bla bla 应该代表什么?

标签: java compilation java-compiler-api


【解决方案1】:

您不能从其他包中的类中引用默认包中的类。自 2001 年以来一直如此。请参阅 Java 1.4 的发行说明。

【讨论】:

    【解决方案2】:

    您应该能够将类路径变量设置为选项。

    List<String> optionList = new ArrayList<String>();
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    String path =....
    optionList.addAll(Arrays.asList("-classpath",path ));
    JavaCompiler.CompilationTask task = compiler.getTask(null, null, null,optionList,null,fileObjects);
    

    【讨论】:

    • 这段代码的问题是,如果你有依赖,类 B 使用 A 作为其中的属性,那么我无法编译它。如果我将 A 类放在一个包中(B 类不需要),我可以正确编译它。我坚持 A 在默认包中而 B 在定义的包中的情况。
    【解决方案3】:

    【讨论】:

    • 第一个与这种情况无关:它涉及所有类都在默认包中并且有一个内部类的情况。第二个与rmic 相关,而不是javac,它被标记为“已关闭:将无法修复”。没有答案。