问题标签 [javacompiler]
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.
java - Apache tomcat maven 插件在不存在的 Java 版本上编译
我正在尝试将我的 Maven 项目与 Tomcat 服务器 8.5 集成。没有集成,一切正常。我在 pom.xml 中用 tomcat7-maven-plugin 替换了 maven-compiler-plugin 并做了其他配置。在 mvn install、mvn clean install 和 mvn tomcat7:deploy 之后,一切都失败了,但有以下异常。
很明显,编译是使用 java 1.5 执行的,而我的 jdk 版本是 1.8.0_144。下面的其他详细信息:
我已将 Eclipse 中的 Installed JRE 设置为 JDK。我的项目的构建路径也反映了相同的情况。
Tomcat 版本 8.5.23
POM.xml 条目
为什么编译可以在 1.5 而不是实际版本上执行?
java - ToolProvider.getSystemJavaCompiler() 在 JDK 9 中返回 null
我在 Eclipse 中的项目正在运行WITH SYSTEM JRE 9。当我尝试将 Java 主页设置为 JDK 9 以获取系统编译器时,我得到了 null。
此代码以前在 JDK 8 上运行良好(从 JRE 8 运行)
ToolProvider.getSystemJavaCompiler 要求的工作方式是否有任何变化?
更新:不确定是否重要,但如果我从 JDK 9(不再需要更改为 java.home)而不是 JRE 9 运行我的项目,getSystemJavaCompiler() 工作正常。
java - 运行时 Java 代码生成:防止 javax.tools.JavaCompiler 在工作目录中创建文件“classlist.mf”
当我运行类似这样的java代码时:
一个名为的文件classlist.mf
出现在我的工作目录中。
我的所有来源都不包含字符串“classlist”。我只使用标准javax.tools
的api。该文件恰好包含我生成的一个(众多)类:
如何防止该classlist.mf
文件出现在我的工作目录中?
java - Java JavaCompiler.run() 也编译匿名类
我正在尝试动态加载文本文件并编译它们。
然后我将在稍后加载编译的 .class 文件:
我目前遇到两个问题:第一个是我加载的 .java 文件是否包含匿名类。JavaCompiler 类似乎不会编译这些。线程“main”java.lang.IllegalAccessException 中的异常:Class Loader.ClassLoader 无法使用修饰符“”访问 Files.myname.myclass$1 类的成员
第二个:有时我会收到 NoClassDefFoundError 的错误:线程“main”中的异常 java.lang.NoClassDefFoundError: Files/myname/myclass 尽管其他类将正确加载并且 .class 文件位于该路径中。
java - Java 8 中 try-with-resources 块中的锁定风险
如果我做
编译器或 JITer 是否存在删除锁创建的风险,因为它认为它在块内未使用?
后期编辑:
一点上下文。我来自 .NET 背景,在 C# 中,允许执行以下操作:
事实上,它甚至可以缩短为
静态编译器和 JIT 编译器将保留BeginTransaction
调用,并且在运行时它总是会发生。
然而,在 Java 中,使用 try-with-resources 处理其他资源似乎存在很多问题和消极情绪。
java - Javac 缺少有效最终的优化
事实:
javac
被编程来检测变量是否有效final
或是否可以有效 final
处理。
证明:
这段代码说明了这一点。
这无法编译,因为编译器能够检测到在函数中重新分配了String
引用。str1
现在
情况一:
final
String
Javac通过避免创建StringBuilder
和相关操作对实例进行了很好的优化。
证明
这个java方法
编译为
问题:
但是现在当我们有效地拥有它们时 final
它没有优化类似的方式并最终编译成
虚拟机
编译器
问题:为什么它不针对有效的 final 进行优化?
generics - java8 泛型可变参数方法的返回类型损坏?
从 Java6 切换到 Java8 后,我遇到了一个问题。
突然一个
java.lang.ClassCastException: java.base/java.lang.Integer 不能转换为 java.base/[Ljava.lang.Object;
被抛出。
似乎泛型类型无法与 java.lang.reflect.Method.invoke(Object obj, Object... args) 的 varargs 参数匹配。
由于代码编译干净并且只会在运行时失败,这对我来说看起来真的很可怕。顺便说一句,如果源/目标定义 < 1.8 ,即使使用 java8 编译和执行也会成功!
为了更好地理解,我准备了一个小 JUnit 示例:
我已经使用这个 pom 用 maven 设置了这个小测试:
如果你执行这个 pom
mvn clean 编译测试 -Djava.version= 1.6
一切都很好。但是执行它
mvn clean 编译测试 -Djava.version= 1.8
将导致 ClassCastException。
任何提示为什么这种行为已经改变。这是一个错误(还是 1.8 之前的一个错误)?非常感谢任何解释。
java - 'overridden method does not throw Exception' when use lambda with override exception thrown
To prevent to be closed as duplicate, this question is totally different with this one.
Consider I have the following interface
It works fine with lambda
But if I let the interface extends from Callable
, it breaks.
With the same usage. Complier gives me following error
- If you remove the override method
R call() throws E
inFuncE0
, it works. - If you use anonymous class, it works.
- If you use eclipse, ECJ works.
What happened when I override the exception thrown? Is this a javac bug?
I'm using jdk_1.8_112
Minimize code to reproduce