问题标签 [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.

0 投票
1 回答
505 浏览

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 而不是实际版本上执行?

0 投票
1 回答
1064 浏览

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() 工作正常。

0 投票
0 回答
68 浏览

java - 运行时 Java 代码生成:防止 javax.tools.JavaCompiler 在工作目录中创建文件“classlist.mf”

当我运行类似这样的java代码时:

一个名为的文件classlist.mf出现在我的工作目录中。

我的所有来源都不包含字符串“classlist”。我只使用标准javax.tools的api。该文件恰好包含我生成的一个(众多)类:

如何防止该classlist.mf文件出现在我的工作目录中?

0 投票
1 回答
560 浏览

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 文件位于该路径中。

0 投票
1 回答
443 浏览

java - Java 8 中 try-with-resources 块中的锁定风险

如果我做

编译器或 JITer 是否存在删除锁创建的风险,因为它认为它在块内未使用?


后期编辑:

一点上下文。我来自 .NET 背景,在 C# 中,允许执行以下操作:

事实上,它甚至可以缩短为

静态编译器和 JIT 编译器将保留BeginTransaction调用,并且在运行时它总是会发生。

然而,在 Java 中,使用 try-with-resources 处理其他资源似乎存在很多问题和消极情绪。

0 投票
2 回答
11411 浏览

android - 错误:当我用 gradle(依赖)中的实现替换编译时

我将我的 Android Studio 从 3.0.1 更新到 3.1.0

但是在我构建项目的更新之后,它显示了2 个警告

1.用实现替换编译(编译支持将在2018年底结束)

2. 将 testCompile 替换为 testImplementaion(并且 testCompile 支持将在 2018 年底结束)

所以,最后做这些改变,但在那之后,它显示了一些错误

错误

build.gradle(模块:应用程序)

build.gradle(项目:Abc)

0 投票
1 回答
298 浏览

java - Javac 缺少有效最终的优化

事实:

javac被编程来检测变量是否有效final或是否可以有效 final处理。

证明:

这段代码说明了这一点。

这无法编译,因为编译器能够检测到在函数中重新分配了String引用。str1

现在

情况一:

final StringJavac通过避免创建StringBuilder和相关操作对实例进行了很好的优化。

证明

这个java方法

编译为

问题:

但是现在当我们有效地拥有它们时 final

它没有优化类似的方式并最终编译成

虚拟机

编译器

问题:为什么它不针对有效的 final 进行优化?

0 投票
1 回答
5763 浏览

android-studio - Android Studio 中的 Java 编译器错误

我刚刚安装了 Android Studio,我花了好几天的时间来尝试设置它,但我在这里和那里都遇到了错误。

我目前的错误是:

它查看了关于 SO 的类似问题,但我找不到有用的解决方案。

我有 Android Studio 版本 3.1.3

我的build.grade文件中有以下内容,但问题仍然存在。

compileSdkVersion 27

buildToolsVersion '27.0.3'

在此处输入图像描述

我可以通过将以下行添加到gradle.properties带有警告的文件中来解决此问题。选项'android.enableAapt2'已被弃用,不应再使用:

但我得到另一个错误:

0 投票
1 回答
38 浏览

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 之前的一个错误)?非常感谢任何解释。

0 投票
1 回答
336 浏览

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 in FuncE0, 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