最近我正在将项目从 JDK 11 升级到 JDK 17。升级后,powermock 似乎出现问题。运行 AUT 时,出现以下错误:
java.lang.RuntimeException: PowerMock internal error: Should never throw exception at this level
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @3fc34119
Run Code Online (Sandbox Code Playgroud)
您是否知道此问题的任何解决方法,如果可以,请提供解决方案。
添加包含JPMS模块的依赖项后,maven-bundle-plugin(版本3.3.0)将失败:
[INFO] --- maven-bundle-plugin:3.3.0:bundle (default-bundle) @ my-bundle ---
[ERROR] Bundle myGroup:my-bundle:bundle:1.0 :
Exception: java.lang.ArrayIndexOutOfBoundsException: 19
[ERROR] Bundle myGroup:my-bundle:bundle:1.0 :
Invalid class file module-info.class (java.lang.ArrayIndexOutOfBoundsException: 19)
Run Code Online (Sandbox Code Playgroud)
似乎插件尝试(并且失败)来分析module-info.class,这在OSGi上下文中应该是无关紧要的.
从maven 3.5.2开始,如果依赖项的版本设置为RELEASE或,则会显示以下警告LATEST:
[警告] <groupId>:<artifactId>:jar的'dependencies.dependency.version'为最新或发布(均已弃用)
如果pom的父版本设置为例如,则不会发出此警告:RELEASE
<parent>
<groupId>com.mydomain</groupId>
<artifactId>base</artifactId>
<version>RELEASE</version>
</parent>
Run Code Online (Sandbox Code Playgroud)
这是故意的,以便我们可以安全地继续依赖RELEASE父pom的版本吗?
我们的用例是为约100个租户托管服务,这些服务需要一组通用的配置文件和一些依赖性管理等。此通用配置在我们的“基础” pom中定义,每个租户的pom都将其用作父级。我们需要所有租户使用父pom的相同版本和最新发布的版本。
假设您有一个带有已弃用的构造函数的参数化类,以及一个User调用此构造函数的类。在下面的示例中,使用菱形运算符,javac(版本 11.0.11)不会生成弃用警告:
class DepTester<T> {
T t;
@Deprecated
public DepTester(T t) {
this.t = t;
}
}
class User {
DepTester<String> tester = new DepTester<>("This does not produce a warning!");
}
Run Code Online (Sandbox Code Playgroud)
但是,如果在构造函数调用中使用显式类型参数,则会发出警告:
class User {
DepTester<String> tester = new DepTester<String>("This produces a warning.");
}
[WARNING] DepTester.java:[17,40] DepTester(T) in com.foo.DepTester has been deprecated
Run Code Online (Sandbox Code Playgroud)
通常不包含显式类型参数,IntelliJ 检查也会对此发出警告:
显式类型参数 String 可以替换为 <>
我在Java 语言规范中找不到这种行为的解释。我尝试使用 javac 17,它在两种情况下都会产生警告,那么这是 javac 11 中的错误吗?
编辑:我向 Oracle 提交的错误报告在 Java 错误数据库中分配了一个 ID:JDK-8281107
使用 JDK 10 构建我的 OSGi 包时,maven-bundle-plugin (3.5.1) 生成以下清单属性:
Require-Capability: osgi.ee;filter:="(osgi.ee=UNKNOWN)"
Run Code Online (Sandbox Code Playgroud)
这在运行时失败:
Unresolved requirements: [[com.mycompany.mybundle [1](R 1.0)] osgi.ee; (osgi.ee=UNKNOWN)]
Run Code Online (Sandbox Code Playgroud)
使用 JDK 9 构建时,我得到了预期:
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=9.0))"
Run Code Online (Sandbox Code Playgroud)
我将 maven-compiler-plugin 的源和目标版本分别设置为“1.9”和“10”。
目前,我正在使用一种解决方法来阻止插件添加osgi.ee到清单:
<configuration>
<instructions>
<_noee>true</_noee>
</instructions>
</configuration>
Run Code Online (Sandbox Code Playgroud)
.. 但我宁愿有正确的 Java 10 要求。