- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Xtext 和 Xtend,我编写了一个 DSL 语法及其关联的代码生成器,该生成器创建了一组构成 Java 应用程序的 Java 源文件。我想为我的同事提供一个程序,让他们选择一个用我们的领域特定语言编写的文件,运行代码生成器以生成实际 Java 应用程序的 Java 源文件,编译这些文件并启动应用程序。这个过程在我的开发机器上运行良好,因为我已经安装了所有东西,包括 JDK。但是向我的同事提供此应用程序会迫使他们在使用该应用程序之前安装 JDK。所以我的问题是:是否可以将 Java 编译器嵌入到分发包中?如果没有,您是否看到其他方法可以继续?我正在使用 Gradle 和 javapackager + Inno Setup 来生成嵌入 JRE 的分发包。
更新 #1
override public void afterGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context)
{
// get the class loader
val URL[] classLoaderUrls = #{new URL("file:jfxrt.jar")}
val URLClassLoader cl = new URLClassLoader(classLoaderUrls)
// set Java compiler options
var CompilerOptions compilerOptions = new CompilerOptions
compilerOptions.sourceLevel = ClassFileConstants.JDK1_8
compilerOptions.complianceLevel = ClassFileConstants.JDK1_8
val Map<String, String> options = new HashMap
options.put(CompilerOptions.OPTION_ReportMissingSerialVersion, CompilerOptions.IGNORE)
options.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.IGNORE)
compilerOptions.set(options)
val InMemoryJavaCompiler compiler = new InMemoryJavaCompiler(cl, compilerOptions)
// compile all generated Java source files
val result = compiler.compile(new JavaSource("xxxx/Bit.java", bitGen.javaSource.toString),
new JavaSource("xxxx/BitNature.java", bitNatureGen.javaSource.toString),
new JavaSource("xxxx/ImageMaker.java", imgMakerGen.javaSource.toString),
new JavaSource("xxxx/MyApp.java", myAppGen.javaSource.toString))
val URLClassLoader runcl = new URLClassLoader(classLoaderUrls, result.classLoader)
val Class<?> mainClazz = runcl.loadClass("xxxx.MyApp")
val Method mainMethod = mainClazz.getMethod("main", typeof(String[]))
val String[] args = #["C:\\temp\\memory_a.yyy"]
try
{
mainMethod.invoke(null, #[args])
}
catch (InvocationTargetException e)
{
e.getCause().printStackTrace()
}
catch (Exception e)
{
// generic exception handling
e.printStackTrace();
}
}
更新#2
单步执行我的代码,我可以看到以下内容:
1 - 这个语句执行没有问题(mainClazz 似乎是一个有效的引用)
val Class<?> mainClazz = result.classLoader.loadClass("xxxx.MyApp")
2 - 当我执行时,mainMethod 似乎也是一个有效的引用
val Method mainMethod = mainClazz.getMethod("main", typeof(String[]))
3 - 当我执行时事情变坏了
mainMethod.invoke(null, #[args])
问题出现在 JavaFX Application 类中,在以下语句中启动方法 (ClassNotFoundException: xxxx.MyApp)
Class theClass = Class.forName(callingClassName, false,
Thread.currentThread().getContextClassLoader());
最佳答案
package org.xtext.example.mydsl2.tests
import java.lang.reflect.Method
import java.net.URLClassLoader
import org.eclipse.xtext.util.JavaVersion
import org.eclipse.xtext.xbase.testing.InMemoryJavaCompiler
import org.eclipse.xtext.xbase.testing.JavaSource
class SampleXXX {
def static void main(String[] args) {
val urls = #[]
val classLoader = new URLClassLoader(urls)
val compiler = new InMemoryJavaCompiler(classLoader, JavaVersion.JAVA8)
val result = compiler.compile(new JavaSource("demo/Demo.java", '''
package demo;
public class Demo {
public static void main(String[] args) throws Exception {
Class theClass = Class.forName("demo.Demo", false,
Thread.currentThread().getContextClassLoader());
}
}
'''))
val URLClassLoader runcl = new URLClassLoader(#[], result.classLoader)
(new Thread() {
override run() {
val Class<?> mainClazz = runcl.loadClass("demo.Demo")
val String[] args2 = #["C:\\temp\\memory_a.yyy"]
val Method mainMethod = mainClazz.getMethod("main", typeof(String[]))
mainMethod.invoke(null, #[args2])
}
}=>[
contextClassLoader = runcl
]).start
}
}
关于javac - 是否可以将 Java 编译器嵌入到应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51065909/
我的问题是关于基本的java命令之一“javac”。我的桌面上有一个“.java”文件。我已经安装了 JDK 7 并将路径变量添加到环境变量中。这是“环境变量”的屏幕截图。 http://s13.po
我制作了我的 gitrepository 并提交了它。 插入了一个 java 文件并想编译它,但它给了我这个: Bernard@BERNARD-PC /c/users/bernard/desktop/
运行Maven时,得到以下输出: [WARNING] Unable to autodetect 'javac' path, using 'javac' from the environment. 我该
我有一个导入一些 servlet 库的类。当我从命令行编译它时它很好。 当我使用 ant compile 任务编译它时,它给出了在其路径中找不到 servlet 库的错误。 这是已知/常见的情况吗?
我试图在 maven-compiler-plugin 中指定另一个版本的 JDK .当-target和 -source参数设置为1.5,一切正常。但是当我尝试使用 1.6 JDK 时,maven 会报
我们的软件之前附带 OpenJDK JRE,但现在我们将附带 Oracle JRE。 之前我们使用 OpenJDK javac 编译器进行编译。我认为现在我们应该使用 Oracle javac 编译器
在大多数现代 IDE 中,您可以设置一个参数来确保 javac 获得足够的堆内存来进行编译。由于不值得在这里讨论的原因,我们暂时与 JBuilder 2005/2006 联系在一起,而且源代码的数量似
我在桌面上的 Notepad++ 中保存了一个名为“first.java”的文件。当我运行 cmd 命令“javac first.java”时,它给了我这个错误。 javac: file not fo
更新: See resolution here. 感谢大家的帮助! 我在尝试使用 Ant 编译项目时遇到错误,它声称“[javac] javac:无效目标版本:7”并导致构建失败。 我在 Mac OS
当我尝试在我的 gwt-maven Projekt 上进行 maven-install 时,我得到了这个错误: [ERROR] Failed to execute goal org.apache.ma
使用 maven 编译时出现编译错误。 [ERROR] COMPILATION ERROR : [INFO] ---------------------------------------------
我正在查看一些内部 javac sun 编译器 API 源代码,并在 Types 类中发现了这一点: public Boolean visitTypeVar(TypeVar var1, Type va
我正在尝试运行 java 应用程序,但出现以下错误, Unable to find a javac compiler; com.sun.tools.javac.Main is not on the c
我有这个类,它是我在从 Java 6 移植到 Java 8 的项目中找到的一些代码的简化: public class Unification { final class Box {}
首先,我要感谢你,并明确地说,我已经在这个问题上苦苦思索了好几天,并在其他类似线程中寻找解决方案,但没有成功。 我们的应用程序负责生成 java 类,其中一些可能在类名(因此文件名)中包含特殊字符,例
以下代码创建了一个Collector,它产生了一个UnmodifiableSortedSet: package com.stackoverflow; import java.util.Collecti
当我用 Maven 编译我的类时遇到问题。堆栈跟踪如下所示: [ERROR] Failure executing javac, but could not parse the error: [ERRO
这个问题在这里已经有了答案: Why Java compiler as distributed as executable and not as JVM bytecode? (1 个回答) 关闭 7
我有一些用 javac 1.8.0_92 编译的代码: public final class Either { // ... private final L l; privat
这个问题在这里已经有了答案: Lombok's access to jdk.compiler's internal packages incompatible with Java-16 (3 个回答)
我是一名优秀的程序员,十分优秀!