标签: java-10

在 Java10 中使用什么来代替`defineClass`?

我使用方法defineClass()ClassLoader字节数组中定义一个类。我使用反射获取此方法:

ClassLoader.class.getDeclaredMethod(
    "defineClass", String.class, byte[].class, int.class, int.class);
Run Code Online (Sandbox Code Playgroud)

Java10 抱怨defineClass.

我应该用什么代替?

java reflection java-10

6
推荐指数
1
解决办法
326
查看次数

Java10 中 sslSocketFactory 的替代方案

我正在使用 OkHttp,我需要忽略应用程序调试的 SSL 错误。这曾经在 Java 8 中工作。

final TrustManager[] trustAllCerts = new TrustManager[] {
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                }

                @Override
                public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new java.security.cert.X509Certificate[]{};
                }
            }
    };

    SSLContext sslContext = null;
    try {
        sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    } catch (Exception s) {
        s.printStackTrace();
    }
    final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

    //
    //.sslSocketFactory(sslSocketFactory) throws error.
    client …
Run Code Online (Sandbox Code Playgroud)

java ssl java-9 java-10 okhttp3

6
推荐指数
1
解决办法
3020
查看次数

Java 10 JavaFX java.lang.IllegalAccessError

我正在尝试将我的 JavaFX Gradle 项目更新到 Java 10。我已经像本指南中一样更改了我的 build.gradle 文件。但是当我尝试运行项目(执行./gradle run)时,我收到此错误:

> Task :run FAILED
Exception in Application start method
java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x5ce4f9a4) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics …
Run Code Online (Sandbox Code Playgroud)

java module javafx gradle java-10

6
推荐指数
1
解决办法
5628
查看次数

OpenJDK 局部变量类型推断风格指南的 Checkstyle 规则

背景:

OpenJDK 发布了局部变量类型推断的风格指南。

我一直在寻找一种内置的检查样式来解决这个问题,但没有找到。

我想要得到的东西非常简单,但我不太熟悉编写自定义模块。

例子:

允许:

  • 实例创建,创建什么一目了然
var something = new Anything(); // OK
Run Code Online (Sandbox Code Playgroud)
  • 它是一个文字,很明显它是什么类型
var something = "literal"; // OK
Run Code Online (Sandbox Code Playgroud)

违反:

  • 即使有好的命名,也不知道是什么类型
var something = anything.doAnything(); // Violation
Run Code Online (Sandbox Code Playgroud)
  • 在这里使用 var 提高了可读性
Anything<Foo<Bar>> something = new Anything<>(); // Violation
Run Code Online (Sandbox Code Playgroud)
  • 没什么大不了的,只是为了保持一致性
String something = "literal"; // Violation
Run Code Online (Sandbox Code Playgroud)

问题:

是否有任何现有规则可以扩展/调整以获得上述内容?我应该尝试编写自己的规则吗?我认为 RegExp 可以处理某些情况,但不是全部。

java checkstyle java-10

6
推荐指数
1
解决办法
452
查看次数

如何使用JDK10(jigsaw)和Maven3来运行JUnit5?

我和一些朋友一起使用jdk 10应用程序,它使用jigsk功能集(在jdk9中引入)和junit5和maven作为构建管理.

但总是如果我们尝试使用Maven运行测试,我们会得到一个InaccessibleObjectException异常,例如:

[ERROR] resourceSchedule  Time elapsed: 0.001 s  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make de.truncated.framework.shared.resources.ResourceManagerTest() accessible: module de.truncated.framework.shared does not "opens de.truncated.framework.shared.resources" to unnamed module @ed7f8b4
Run Code Online (Sandbox Code Playgroud)

我现在谷歌搜索...在jdk9它可以简单地使用--permit-illegal-access,但这在jdk10中是不可能的,因为这个标志被删除了.来自junit5的jdk10代码示例和github上的其他代码不会使用拼图看起来如何.

所以看起来我错过了maven,module或jvm args config中的一些主要内容.如果有人可以就此事提供帮助,那将是非常好的.

非常感谢你!

项目的一些额外信息可能会有所帮助:

  • 主代码由模块信息文件配置,该文件导出(不打开)给每个人(它的代码库之类的框架)
  • 测试代码没有模块化
  • 目前没有应用jvm args

二手版本:

<properties>
   <java.version>10</java.version>
   <maven.compiler.version>3.7.0</maven.compiler.version>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <surefire.version>2.21.0</surefire.version>
   <asm.version>6.1.1</asm.version>
   <junit.jupiter.version>5.2.0</junit.jupiter.version>
   <junit.platform.version>1.2.0</junit.platform.version>
</properties>
Run Code Online (Sandbox Code Playgroud)

depencies:

    <!--
    junit 5 dependency
    -->
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>${junit.platform.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

构建插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.version}</version> …
Run Code Online (Sandbox Code Playgroud)

java maven-3 java-platform-module-system java-10 junit5

5
推荐指数
1
解决办法
797
查看次数

在Java 9+中使用JRE运行时,我可以提供运行时编译器访问吗?

我正在将应用程序迁移到Java 10.我们的应用程序通常使用JRE运行,但我们允许用户通过捆绑tools.jar和使用反射来JavacTool按需加载实例来编译自己的自定义代码.我们的方法如下:

public static JavaCompiler getJavaCompiler() {
    String toolJarName = "tools.jar";
    File file = getResourceForClass("tools.jar");
    try {
        file = file.getCanonicalFile();
    } catch (IOException ignore) {
    }
    if (!file.exists())
        throw new RuntimeException("Can't find java tools file: '"+file+"'");
    try {
        URL[] urls = new URL[]{ file.toURI().toURL() };
        URLClassLoader cl = URLClassLoader.newInstance(urls);
        return Class.forName("com.sun.tools.javac.api.JavacTool", false, cl).asSubclass(JavaCompiler.class).newInstance();
    } catch (Exception e) {
        throw new RuntimeException("Can't find java compiler from '"+file+"': "+e.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为javax.tools.ToolProvider.getSystemJavaCompiler()从JRE运行时返回null.我们的方法在Java 8中运行良好,但tools.jar在Java 9中被删除了,我需要的类 …

java java-platform-module-system java-9 java-10 jmod

5
推荐指数
1
解决办法
408
查看次数

更改场景构建器和jdk后,javaFX程序无法正常工作

我的程序之前工作得很好,并且我将场景构建器从JavaFx场景构建器2.0更改为胶子场景构建器10以添加一些CSS样式.我添加了样式,程序显示错误,例如 警告:使用版本10.0.1的JavaFX运行版加载版本10.0.1的JavaFX API的FXML文档 然后我将我的JDK更新到版本10.0.2但它显示了这样的错误.

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:973)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198)
    at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.NoClassDefFoundError: com/sun/javafx/css/parser/CSSParser
    at de.jensd.fx.glyphs.GlyphIcon.<clinit>(GlyphIcon.java:48)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
    at java.base/java.lang.Class.newInstance(Class.java:560)
    at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:1019)
    at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:754)
    at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3253)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3210)
    at …
Run Code Online (Sandbox Code Playgroud)

javafx scenebuilder java-10

5
推荐指数
1
解决办法
1355
查看次数

如何使用Java 10中的Flow API替换Observable / Observer代码(最好不使用多线程)?

最近,我将我的项目从Java 8升级到Java 10,并发出了很多警告,指出现在不推荐使用Observer和Observable。替换它们的建议是Flow API-问题是我尚未找到有关如何为Flow API编写代码的不错的教程。我发现的所有内容都说不能直接实现发布者/订阅者,而且我发现的许多内容都表明Flow API很大程度上基于多线程。

注意:我已经在StackOverflow以及Quora和其他一些站点上找到了这个答案,有人引用不能对Observable对象进行序列化,这在我为我的每个bean和许多bean实现Serializable时都完全不正确。我的其他类也是如此,甚至已经序列化以归档我的一些对象,并将它们从文件中读回到对象形式。

但是,多线程是一个问题-我不希望在响应模型对象的更改时使用流或多线程。问题1是-是否绝对需要使用Flow API,还是存在另一组不需要多线程和流​​的类/接口?

在查看Flow.publisher的javadocs时,我将用Observable替换-因为这是一个接口,这意味着我想我必须放入(类似于ListModel和TableModel类的实现)订阅者集合(类似于Observers?),并放置自定义代码以将其添加到我的发布商中或从中删除?问题2-我有权利吗?

问题3.)Flow.Publisher和Flow.Subscriber中的通用类型参数是什么?它显示了一个类型,但是我不知道在哪里使用该类型-我将在这里为我的一个模型类放置代码:

package net.draconia.frenchstudy.model;

import java.io.Serializable;

import java.util.concurrent.Flow.Publisher;
import java.util.concurrent.Flow.Subscriber;

public class Category implements Publisher<Category>, Serializable
{
    private static final long serialVersionUID = 5281400324476454101L;

    public static final Category EMPTY_CATEGORY = new Category(); 

    private Integer miId;
    private String msCategory;

    public Category()
    { }

    public Category(final int iId)
    {
        setId(iId);
    }

    public Category(final String sCategory)
    {
        setCategory(sCategory);
    }

    public Category(final int iId, final String sCategory)
    {
        setId(iId);
        setCategory(sCategory);
    }

    public String getCategory()
    { …
Run Code Online (Sandbox Code Playgroud)

java observable observer-pattern java-10

5
推荐指数
0
解决办法
443
查看次数

主方法不在模块内运行

我是否需要main在模块内或外部运行我的方法?

我是使用Java模块化系统的新手.我正在尝试使用Java 10中的JavaFX创建一个简单的程序,因为它是支持JavaFX的Java的最后一个版本.

我在module-info.javaJavaFX 上导入了必要的依赖项,它只显示了一个简单的窗口.

sample.fxml 码:

<?import javafx.scene.layout.GridPane?>
<GridPane fx:controller="com.gui.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>
Run Code Online (Sandbox Code Playgroud)

当我构建我的代码时,它说:

Warning:(4, 27) java: module not found: com.main
Run Code Online (Sandbox Code Playgroud)

当我尝试运行我的代码时,我得到:

Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)
Run Code Online (Sandbox Code Playgroud)

任何人都可以为此提供建议,或者以某种方式提供有关使用模块化系统创建项目的实际应用建议.

我在下面附上了一对截图.

建立警告:

在此输入图像描述

运行时失败:

在此输入图像描述

java javafx java-10 java-module

5
推荐指数
1
解决办法
207
查看次数

从java 10升级到java 11并将gradle 4.10升级到gradle.5.2:"默认构造函数中未初始化变量"

我有一个简单的对象:

@Value
@Builder
public class User implements Serializable {
    private final String userId;
    private final String email;
    private final String name;
}
Run Code Online (Sandbox Code Playgroud)

这里没有魔法,除了我Lombok 1.18.2在这里使用@Value@Builder注释的事实.所有这些都适用于Java 10和Gradle 4.10.现在我升级到Java 11和Gradle 5.2,然后突然得到:

> Task :application:compileJava
/src/application/src/main/java/com/rbb/tutor/user/model/User.java:12: error: variable userId not initialized in the default constructor
    private final String userId;
                         ^
/src/application/src/main/java/com/rbb/tutor/user/model/User.java:13: error: variable email not initialized in the default constructor
    private final String email;
                         ^
/src/application/src/main/java/com/rbb/tutor/user/model/User.java:14: error: variable name not initialized in the default constructor
    private final String …
Run Code Online (Sandbox Code Playgroud)

java gradle lombok java-10 java-11

5
推荐指数
2
解决办法
377
查看次数