问题标签 [java-runtime-compiler]

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 回答
247 浏览

chronicle - 使用新的类定义重新编译以进行突变测试

我正在尝试使用openHFT/java-runtime-compiler来改进我的变异测试工具,从大量使用磁盘访问到仅使用内存中编译。

在变异测试中,有两种类: A. 变异类,它的定义将不断被操纵/改变和重新编译的类。 B. 其他类,定义不会改变的类,即测试用例类,或者变异类需要的其他类。

通过使用 openHFT/java-runtime-compiler,可以使用下面的代码轻松完成,它是通过为变异类和其他类的每次重新编译创建一个新的类加载器。

这很好用,每次编译 A 类的新定义时,AClass都会适应新定义。

但是,如果顺序颠倒,这将不起作用,就像下面的代码(首先加载BClass然后AClass),有时需要,比如当AClass使用BClass时。类 A 的重新编译,不会适应新的定义,并且将始终使用用于编译类 A 的第一个定义。

我怀疑我需要修改openHFT/java-runtime-compiler 库中的loadFromJava类(代码如下)。我已经尝试省略这些行

我希望每次调用loadFromJava时总是重新编译所有源代码(甚至是已经编译的源代码) 。但它给出了错误的结果。

请帮助我指出使其生效所需的更改。

非常感谢您的帮助。

已编辑

谢谢彼得劳里,我已经尝试过你的建议,但它给出了相同的结果,A 类坚持使用的第一个定义(在第一次迭代中),并且无法更改/使用新定义(在下一次迭代中) .

我收集了症状,可能的解释是第一次迭代(第一次编译/加载类)与下一次迭代有一些不同的处理。从那里我尝试了几件事。

第一个症状

那是当我在 loadFromJava 中放置一个输出行(System.out.println)(下)

输出给出:

在第一次迭代中,它给出了正确的输出,“loadClasses Null”(加载 B 时),因为 loadedClassesMap 没有 classLoader,并给出“clazz Null”(加载 A 时),因为 loadedClassesMap 有 classLoader 但没有t 具有 A 类名。

但是在下一次迭代中,(加载 A 时)它输出“clazz Not Null”,似乎 A 类名已经存储在 loadedClassesMap.get(classLoader) 中,这是不应该发生的。我试图在 CachedCompiler 构造函数中清除加载的ClassesMap。

但它给出了 LinkageError: loader (instance of main/Utama$2): 尝试重复的类定义。

第二个症状

第一次迭代中更强烈的差异症状是当我检查 s_fileManager 缓冲区时。

第一次迭代正如预期的那样,但在下一次迭代中,s_fileManager 缓冲区似乎已经达到了 2 的大小,并且没有重置为 0。

我试图在 CachedCompiler 构造函数(如下)中清除 FileManager 缓冲区,

但它给出了ExceptionInInitializerError。

0 投票
0 回答
130 浏览

java - 应用程序中的多个 JVM 问题

我们有一个桌面应用程序,我们在其中打包应用程序 Jar 和 JRE,以避免客户机器中的 Java 依赖。

但问题是客户是否已经在机器中安装了 Java。由于某些类的 Java 版本依赖关系,我们面临没有类定义异常之类的问题。

现在我的问题是如何始终使用与应用程序一起打包的 JRE 启动应用程序,并确保它在安装后不使用系统 JRE。

0 投票
3 回答
12815 浏览

java - IntelliJ:致命错误编译:无效的目标版本:1.8

我在 IntelliJ 上运行一个 Java Maven 项目,我确保这个项目将由 Java 1.8 编译。

我在运行/调试配置中将 JRE 设置为版本 8 在此处输入图像描述

并且在项目结构中: 在此处输入图像描述 我的 pom.xml 文件还包括以下 Java 版本 8:

我还将 Java 编译器选项设置为 1.8 版。在此处输入图像描述

当我运行项目时,我收到一个错误:

无法在项目 feed_matcher 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile):致命错误编译:无效目标版本:1.8 -> [帮助 1]

你知道如何解决这个问题吗?

PS我点击了这个链接:IDEA: javac: source release 1.7 requires target release 1.7,但我仍然无法解决问题。

0 投票
1 回答
1577 浏览

pycharm - IDE 的 Java 运行时 (1.8u66) 已过时 - 这可能会导致稳定性问题。请在打开 PyCharm 社区版时更新到 1.8.0u112 或更高版本

我最近下载了 PyCharm 社区版,用于使用 Python3 进行自动化开发。当我启动 pycharm 时,我在事件日志中收到以下警报以升级我的 Java 运行时。我正在使用 Centos 6.7,如何更新我的 Java 运行时?

我曾尝试在 PyCharm 上切换 Java 运行时,但由于我没有升级我机器上的 java 运行时,我无法在 PyCharm 上选择最新的运行时。

错误:IDE 的 Java 运行时 (1.8u66) 已过时 - 这可能会导致稳定性问题。请更新到 1.8.0u112 或更新版本

0 投票
1 回答
48 浏览

java - 如何为自定义 JVM 语言实现静态代码分析工具的类型信息?

我必须为自定义 JVM 语言实现一个静态代码分析工具,并且我希望拥有 JavaClass<?>类中可访问的大多数方法,例如:getDeclaredMethods(): Method[]. 我想出了两种方法:

1)编译所有类,这样我就有了.class文件,我可以在这些文件上调用javap,然后将javap的结果保存到java源文件并使用Java类型信息。

2) 使用 antlr4 并创建与 Java 中可访问的相同的类结构。也许还有其他方法?

我觉得选项 2 是在重新发明轮子,或者它可能是有效的方法?我认为选项 1 会更好,但我不确定这是否可行……然后它不是真正的静态代码分析,因为我需要编译我的自定义语言的所有文件。

你能帮我吗,或者至少给我指出正确的方向?

0 投票
2 回答
669 浏览

android - 如何在 xamarin 移动应用程序中未调用 Looper.prepare() 的线程内创建处理程序

我有一个具有指纹身份验证的移动应用程序,它使用 xamarin 框架。到目前为止,除了三星 Note 8 之外,所有设备都运行良好。在尝试调试此设备时,它给了我一个异常 Java.Lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序。我不知道它是什么意思以及如何修复它,因为它适用于其他设备。它在行 keyGen.Init(keyGenSpec)上给出异常

0 投票
1 回答
39 浏览

windows - 获取最新的 Java Runtime Enviroment 父文件夹

我想让我的工作更轻松一些,我尝试创建一个批处理文件来获取 JRE 路径。我只得到 javaw.exe 路径。例如,我们使用的是 Team Center 10。它有这个 tem_init 并抓取文件夹 JRE7(示例版本),但人们更新到最新版本并卸载。我正在寻找一个自动获取安装的 JRE 的批处理文件。

我想要一条这样的路C:\Program Files\Java\jre7

0 投票
1 回答
56 浏览

java - Java Runtime -ERR 'fsctl Command not found

I run a command using java Runtime.That command work fine when i executed normally on terminal/command promp but unable to execute through Java.Runtime :-

It give output "-ERR 'fsctl Command not found!"

0 投票
2 回答
615 浏览

java - 为什么这段代码会引发 RuntimeError?

给定一个随机整数数组和一个数字 x。查找并打印数组中总和为 x 的元素的三元组。打印三元组时,首先打印最小的元素。也就是说,如果一个有效的三元组是 (6, 5, 10) 打印“5 6 10”。没有限制必须在第一行打印 5 个三元组。您可以按任何顺序打印三元组,只需注意三元组中元素的顺序。

0 投票
1 回答
7663 浏览

java - UnsupportedClassVersionError:Gradle 和 Java 运行时版本出错

我对 Gradle 很陌生,我想尝试一下这个很酷的项目:Strange,一个用于 Java 的量子计算 API(我将在下面留下一个 github 项目的链接)。他们推荐使用 Gradle,所以我这样做了。

在我正在处理的目录中,只有 3 个文件:

  1. 我的 java 主类HelloStrangeWorld.java
  2. build.gradle ,
  3. settings.gradle

现在我只想在我的目录中测试命令:

我得到了这个:

FAILURE:构建失败并出现异常。* 出了什么问题:java.lang.UnsupportedClassVersionError: org/javamodularity/moduleplugin/ModuleSystemPlugin 已由更新版本的 Java Runtime(类文件版本 55.0)编译,此版本的 Java Runtime 仅识别最高版本的类文件52.0

org/javamodularity/moduleplugin/ModuleSystemPlugin 已由更新版本的 Java Runtime(类文件版本 55.0)编译,此版本的 Java Runtime 仅识别最高 52.0 的类文件版本


我有的 :

  • 我的 Java 设置为 1.8

  • 我使用 SDKMAN 安装了 Gradle

build.gradle的内容如下:

我的主要课程内容如下:

到目前为止我已经尝试过:

  • 我检查了我的 JAVA_HOME 是否设置为我的 jdk8。我使用 zsh,所以我检查了 .bashrc 和 .zshrc,并且在这两个地方都设置了 env 变量。

  • 我从 Java 8 更改为 Java 7,它返回我说 Gradle 不应该与 Java 7 一起使用。所以我回到了 Java 8

  • 我检查了 /etc/alternatives 中设置的符号链接,所有与 java 相关的都指向 java 的版本 8

我是否遗漏了有关使用 Gradle 的一些明显内容?

谢谢

这是gitHub 上 Strange 项目的链接。