问题标签 [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 投票
0 回答
156 浏览

java - 使用 javax.tools.JavaCompiler 时设置 JVM 堆空间

我正在使用 JavaCompiler API 来编译一些 Java 源代码。但是,我收到了 OutOfMemoryError 异常。我尝试使用 -Xmx1G 选项,但它不起作用:

有没有人成功地增加了设置正确选项的堆大小?我也没有成功尝试过:

Xmx1G

-Xmx1G

J-Xmx1G

-J -Xmx1G

-J Xmx1G

0 投票
2 回答
1904 浏览

java - 为什么 Grails 在 Mac OS x 7 上使用旧的 JVM 编译器?

操作系统 x 10.7

我想在其中一项服务中使用 Java 1.7 NIO,我得到了以下信息:

怎么回事!他妈的!?好的。我在代码中检查java版本:println

最后我明白了

或者更具体地说

变成:

0 投票
1 回答
345 浏览

classpath - 将 JavaCompiler 与类路径一起使用,在 ear 中引用 jar

我正在开发一个项目,其中部署在 JBoss 服务器上的企业存档(ear)需要动态编译(和运行)一个类。我正在使用 JavaCompiler 类来执行此操作 - 复杂性来自这样一个事实,即正在编译的类引用了包含在耳朵内的 ejb jar 中的一些类。

当部署的耳朵在部署时“爆炸”时,这不是问题,因此它只是一个目录而不是存档 - 在这种情况下,我可以在编译器的 -classpath 选项中指定所需的 jar,并且编译工作美好的。不幸的是,由于我正在使用的系统的限制,将这些耳朵“爆炸”部署不是一个可接受的解决方案,并且编译器似乎无法“看到”所需的 jar,当它被打包在档案中时。

鉴于动态编译是从有问题的耳朵进行的,因此系统的类加载器可以访问所需 jar 的内容,有什么办法可以告诉编译器只使用系统类加载的类装载机?

我很欣赏这是一个冗长的问题,但任何帮助将不胜感激。

谢谢

0 投票
3 回答
1711 浏览

eclipse - 在 Eclipse 中使用 Tomcat 中的 JavaCompiler 使用 webapp 类路径和 Maven

我有一个现有的“示例 Webapp”,它使用 Maven 引用“示例库”。我在 Eclipse 4.3RC3 中使用 m2e 插件运行 Tomcat 7。当我在 Eclipse 内的 Tomcat 上启动 Example Webapp 时,我已经验证它example-library.jar可能已部署在 Tomcat 实例的WEB-INF/lib文件夹中。

示例 Webapp 具有使用JavaCompiler.CompilationTask. 这些动态生成的类引用example-library.jar. 不幸的是,编译任务失败,因为找不到引用的类。

我知道我可以设置JavaCompilerclasspath,但System.getProperty("java.class.path")只返回 Tomcat 类路径,而不是 webapp 类路径:

其他人我需要WEB-INF/lib从 servlet 上下文中获取真正的路径,但是类生成代码对 servlet 上下文一无所知 --- 它被编写为不知道它是在客户端还是在客户端上使用服务器。

另一个问题中,一个答案表明我可以枚举类加载器 URL,果然这为我提供了 jars WEB-INF/lib,但是当我将其作为-classpath选项提供时compiler.getTask(),任务仍然失败,因为它找不到引用的类。

如何简单地将当前执行代码的类路径提供给JavaCompiler实例,以便它从库中找到类WEB-INF/lib?(提出了一个类似的问题,但从未回答有关使用 .ear 文件中引用 jar 的问题JavaCompiler。)

示例:为了不惜一切代价让事情正常进行,我什至尝试对类路径进行硬编码。例如,我foobar.lib在我的 webapp lib 目录中有,所以我使用了以下代码,根据我上面指出的答案修改:

最后successfalse,我diaognostics表示package com.example.foo.bar does not exist...,即使那个包在foobar.jar.

0 投票
1 回答
947 浏览

java - 在 Eclipse Plugin 运行时编译 Java 类

我在这里处于一个非常尴尬的境地。我正在开发一个“Eclipse 插件”,它必须将 .java 文件“编译”成 .class 文件(甚至可能是一个 jar)。

我正在尝试使用Java Compiler API来执行以下操作:

问题是,当我打电话时_sjfm = _javaCompiler.getStandardFileManager(null, null, null);遇到 NullPointerException 因为,这是不运行 JDK 时的“预期”行为(请参阅此错误报告

这篇StackOverflow 帖子在某种程度上帮助了我,但是从必须可发布的 Eclipse 插件中编译 Java 文件的正确方法是什么?

  1. 使用替代的“编译器”,只包含罐子并使用它们?
  2. 在我的插件中包含 tools.jar(位于 JDK 文件夹中),动态加载它并从中编译?
  3. 我想不出的任何其他解决方案

你会推荐什么 ?

0 投票
1 回答
2330 浏览

eclipse - 如何以编程方式使用 JDT 编译器?

我使用 JDT 来编译我的 java 类。BatchCompiler 返回一个字符串,但我需要一组问题/错误及其列和行信息。编译器.编译(单位);将错误打印到它的打印机,compiler.resolve(unit) 完全符合我的要求,但它只能编译一个 java 文件。

我以这种方式创建了一个编译器对象:

并为编译器创建包含文件名和文件内容的 CompilationUnits。

AFAIK,有 2 种编译方法,其中一种是 compile(units) 方法,它返回 void 并向其 PrintWriter 打印错误和问题,因为它不返回列信息,这对我没有用。另一种方法是 resolve(unit) 方法,但它只能与一个 CompilationUnit 一起使用。

有谁知道我如何以编程方式使用 JDT 编译器来编译多个文件?

0 投票
1 回答
289 浏览

api - Javac:忽略“应该在名为...的文件中声明”

我正在使用编译器 API (javax.tools.JavaCompiler) 中的工具来动态生成 Java 字节码。我构建源代码并使用 API 编译它,然后通过反射使用它。

只要我只尝试生成的非公共类,那就太好了。如果我这样做,我会得到一个“MyClass 类是公共的,应该在名为 MyClass.java 的文件中声明”,这是完全正常的,它不是从 Java 文件编译的。

我正在寻找绕过此错误的方法,在 Java 选项和 API 中都没有找到。

0 投票
1 回答
233 浏览

java - 如何获取编译器编译一个类所需的所有源的列表

为了在运行时创建和加载一个类,我首先从数据库中读取它的内容,创建一个新的SimpleJavaFileObject,最后在运行时通过将它传递给CompilationTask来编译它。关键是这个新文件可能引用其他文件(直接导入或通过 de.package.*“间接”),这些文件也存储在 db 中,不能作为类或源代码文件使用。

像 Test1 一样,我必须提前一步创建和编译 Test2,因为没有JavaFileObjects或类可以提供给编译器。

那么:如何获得编译器编译一个类所需的所有源的列表?

知道 Test1 需要 Test2 就足够了。我首先通过将Processor传递给CompilationTask来尝试它。我检查了树中的所有属性,但没有发现任何有用或完整的东西。如果在包上使用 * 导入了一个类,则无法获得完整的限定名......至少对我来说不是:-/

有任何想法吗?也许有更好的方法来解析javasources?

感谢您的帮助:-)

0 投票
1 回答
712 浏览

java - ClassNotFoundException 加载运行时编译的子类

我正在使用 JavaCompiler 在运行时从 Web 应用程序中编译 CustomProcessor.java

编译顺利,我最终得到了一个我试图加载的类文件URLClassLoader

问题是我正在点击我ClassNotFoundExceptionProcessor应用程序其他地方使用的一个(因为我知道它在那里)。
我需要做什么才能在运行时com.mycompany.Processor可见

谢谢。

0 投票
1 回答
260 浏览

java - 用java编译一个Jar

多年来,我一直在使用 IDE (Eclipse) 为我编译我的 jar 文件,这些年来我已经了解了它们是如何工作的,但是我仍然不完全理解 jar 是如何知道主要方法在哪里的,我也是好奇手动编译它有多简单(或不简单)。

我有一个(某种)我正在开发的 IDE,它需要能够编译和运行一个 jar,其中包括来自用户的文件以及一个 jar 或一堆其他类(API),我有在这里看到一些提到 JavaJavaCompiler类但从未提供演示代码的问题,而且似乎几乎没有人知道如何手动编译,所以我想贡献一下。那么,如何使用 java 代码创建 jar 文件呢?请提供演示代码。