问题标签 [java-compiler-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
899 浏览

java - java运行时类生成框架

我希望 Java 7 具有 Java 8 的一项功能:方法的自动接口实现生成(避免由于反射调用导致性能不足)。我知道 Java 8 在编译时提供了生成,但我认为 Java 7 不可能(没有维护元数据文件)。所以我同意在运行时生成实现。

例子:

我有以下界面:

和一个 bean 类(或接口)

我需要为 Foo 的每个属性提供一个 Extractor 接口的实现。类似于Foo::getProperty1Java 8 的东西。

我应该使用JavaCompiler(目前我几乎没有要实现的接口并且可以使用模板类)还是你有更好的解决方案?

主要要求是短的字节码生成时间和 LGPL 兼容性(可用于商业产品)。

如果可能的话,为我的案例提供一个小例子。

0 投票
0 回答
234 浏览

java - Maven 代码生成和编译插件:Java 编译器:类路径问题

我正在开发一个 Maven 插件,它将生成代码并编译它。当我通过 Eclipse 中的测试使用插件源代码时,一切正常。甚至无需在 JavaCompiler ( Javax.tools ) 中设置类路径。

但是,当我将它打包并作为 Maven 插件运行时。生成代码的编译失败,无法找到 Jackson 注释等引用的类。

我试过了

  1. 尝试在指向本地 maven 存储库的 JavaCompiler 上设置类路径选项,它仍然找不到必要的类。
  2. 将类路径设置为jackson注释jar和commons lang(我生成的代码需要它们),然后事情似乎可以正常工作。

工作代码:

使用 jar 方法的路径设置类路径的问题:

  • 它不干净。插件的用户需要指定这些 jar 的位置(甚至不将其视为一个选项。

有什么更好的方法可以确保我的 JavaCompiler 可以找到必要的依赖项来编译生成的代码。

任何帮助将不胜感激。

0 投票
2 回答
629 浏览

java - glassfish4,CompilationTask.call 方法上的 javacompiler 类加载器错误 - 找不到符号

在 task.call() 方法中使用 glassfish4、jdk1.7 错误,

在 j2se 客户端代码工作正常,在 glassfish 服务器得到错误

示例代码;

如何在 glassfish4 中使用 javacompiler?我还尝试在 sun-web.xml 中设置 class-loader delegate=false,但之后 ejb bean 不起作用

谢谢

0 投票
2 回答
534 浏览

java - 使用jdk1.6编译器API编译时如何将内存中的jar文件放入classpath?

我正在使用 jdk1.6 编译器 API 进行一些动态编译。
现在,我只是将所有需要的 jar 文件转储到磁盘,以便在编译时将它们包含在类路径中。
是否有某种技巧可以将内存中的 jar 文件直接放入类路径中?
我无法通过扩展 javax.tools.ForwardingJavaFileManager 来弄清楚如何做到这一点。
有人可以给我一些提示吗?
谢谢。

0 投票
1 回答
1100 浏览

classloader - 与 Drools 5.6.0 共享 ClassLoader 以允许在运行时在内存中编译类

我正在编写一个简单的实用程序,它读取 XML 文件,将它们的节点转换为 POJO,将它们加载到 Drools 的 WM 中,最后对它们应用一些规则。您可以在我的GitHub 个人资料上找到整个项目。不幸的是,尽管我付出了所有努力,我还是无法让 Drools “喜欢”在运行时编译的任何类实例。我看到很多人在使用 ClassLoader 时也遇到了问题,所以我怀疑这可能是它的错……我准备了一个最小的工作示例供您尝试,它可以在GitHub和下面的此处获得。它需要一些仅在GitHub 上MemoryFileManager可用的其他小文件(MemoryJavaClassObject和)MemoryJavaFileObject为简洁起见。为了正常工作,此示例要求您的 JVM 是 JDK >= 6,并且您tools.jar的. 示例如下:classes.jarclasspath

如果我运行该示例,我会得到以下输出:

如您所见,Person该类已在内存中成功编译并实例化(请参阅Hello, HAL!输出中的消息),但是如果我将其添加到 WM,Exception in thread "main" java.lang.NoClassDefFoundError: Object (wrong name: Person)即使没有规则明确依赖Persons,我也会得到一个。现在,我稍微调查了一下这个异常,我意识到当在Drools 使用的类Person中找不到给定的类 ( )时,它会被触发。ClassLoader因此,我通过添加一个配置来更改我的代码,该配置引用了ClassLoader用于编译和实例化HALtheKnowledgeBuilder和 的相同配置KnowledgeBase,但是我可能做错了什么,因为我仍然得到相同的异常。

您知道为什么会发生这种情况以及如何解决它吗?提前谢谢了!

0 投票
1 回答
53 浏览

java - 创建和销毁主类及其超类的顺序是什么

鉴于从主方法开始执行,如何在主类实例之前创建超类实例,如果必须在主类之前先初始化超类,是先销毁主类的超类还是先销毁主类必要时会损害程序吗?

0 投票
1 回答
47 浏览

java - 了解代码如何工作的可视化工具

是否有可视化工具帮助人们了解 Java 代码的工作原理,例如,嵌套的 for 循环在编译时如何执行?更好的工具,这样人们就可以剪切和粘贴他们的代码以查看他们自己的代码是如何编译的。

0 投票
1 回答
1986 浏览

java - 动态重新编译和重新加载一个类

我正在用java构建一个可以接收java源文件的服务器,它应该使用JavaCompiler动态编译它,然后加载该类。然而问题是,如果服务器接收到一个同名但内容不同的文件,它仍然会加载以前的类并给出相同的输出。我注意到一些答案建议为我尝试加载的类创建一个超类并使用不同的类加载器,但是如果 java 源文件被动态发送到服务器,情况仍然如此吗?

这是我在 FileServer.java 中的编译和加载方法:

0 投票
1 回答
1223 浏览

java-compiler-api - Java 编译任务和类路径选项不起作用

我试图创建一个类来编译一些我将在运行时创建的 .java,但我无法让它正常工作。

这是我的代码

我正在尝试编译一个扩展 ParentProject.jar 中的类的 Son.java,但它不起作用,即使使用“-classpath”标志也是如此。但是,如果我将 jar 添加到编译器项目的构建路径,它就可以工作(并且它不需要类路径标志)。这是正常行为吗?

这导致了另一个问题。当我尝试在 Tomcat 服务器上运行的项目中使用这段代码时,即使使用 WEB-INF/lib 中的 jar,我也无法让它工作。

0 投票
0 回答
1003 浏览

java-compiler-api - toolprovider.getsystemjavacompiler() 返回 null

首先,我看到很多关于使用 JavaCompilerAPI 的问题,我想澄清一下,我正在创建一个在线模拟构建器,它需要用户的太多输入来预创建类。这就是为什么我使用 java 编译器来编写使用用户输入的类的原因。

至于我的问题,我已经用一些基本的编译器程序进行了测试,目前正在使用这里找到的代码:动态编译而不创建物理文件

代码编译成功,但是当我运行代码时,
ToolProvider.getSystemJavaCompiler(); 返回空值。

从其他条目中,我了解到一个原因可能是默认的 java.home 是 JRE,所以我在我的 JDK 版本中添加了设置 java home 的行:

我还使用我的程序将 tools.jar 添加到文件夹中,并在类路径中调用指定 tools.jar 的程序,如下所示:

这些方法并没有改变任何东西。关于可能是什么问题的任何想法?

...