标签: java-9

尝试在 java 9-ea 中使用 javapackager 打包本机映像时出错?

我正在尝试 java 9-ea (jdk-9+180) 和新的 javapackager 从简单模块创建本机映像,但出现空指针异常。有人知道我是否太早了或者我是否没有使用正确的命令开关来使其工作?jlink 命令工作正常,但 javapackager 却不行。在撰写本文时,我正在使用最新的 jdk-9+180。我已尝试使用-native exe-native image开关,但出现了相同类型的错误。我也在我的 Mac 上尝试过使用交换机创建本机 dmg -native dmg,但在该平台上出现了相同的错误。我真的很想在这里使用 javapackager 来将构建捆绑到exe/dmg.

编辑 1: 我已经提交了有关此问题的错误报告,现在可以在以下网址中看到该报告:http://bugs.java.com/bugdatabase/view_bug.do ?bug_id=JDK-8186661

我的模块信息.java:

module my.module {
    requires javafx.graphics;
    requires javafx.fxml;
    exports sample;
}
Run Code Online (Sandbox Code Playgroud)

首先,我使用 javapackager 创建一个运行良好的 jar:

C:\Java9Test\target>javapackager -createjar -appclass sample.Main -srcdir classes -outdir . -outfile myjar -v

我已经验证了生成的 jar 结构看起来与正确编译的module-info.class以及其中的其他两个类没有问题。

以下 jlink 命令可以工作并生成可运行的简化运行时映像:

C:\Java9Test\target>jlink --output release\MyTestApp --compress=2 --module-path "myjar.jar;C:\Program Files\Java\jdk-9\jmods" --add-modules my.module

但是,当尝试以下命令以使用 javapackager 创建本机映像时失败:

C:\Java9Test\target>javapackager -deploy …

javafx java-9 javapackager

3
推荐指数
1
解决办法
3681
查看次数

为什么在 System.Logger 中使用 log(DEBUG, msg) 而不是 debug(msg)?

我正在阅读 Java 9 中引入的 System.Logger API。我不明白他们为什么开发这样的strangeAPI:

System.Logger {
  public default void log(Level level, String msg){...}
}
Run Code Online (Sandbox Code Playgroud)

我调用它strange是因为所有流行的日志框架(我知道)都不将级别作为参数,而是按级别名称命名调用方法。例如:

//Log4j
logger.error("This is error : " + parameter);
//SLF4J
logger.debug("Printing variable value: {}", variable);
//apache.commons.logging
log.debug(Object message);
//and even sun.util.logging.PlatformLogger
logger.warning(String msg)
Run Code Online (Sandbox Code Playgroud)

怎么解释?

java logging java-9

3
推荐指数
1
解决办法
363
查看次数

从遗留代码到 Java 11 的迁移问题

我们正在迁移旧代码,实际上相当旧的代码到 Java 11。我在编译其中一个类时遇到问题。示例代码是:

package XXXX;

import java.lang.ref.*;
import sun.security.action.*;
import java.security.*;
import java.io.*;

class Converters
{
    private static Object lock;
    private static String converterPackageName;
    private static String defaultEncoding;
    public static final int BYTE_TO_CHAR = 0;
    public static final int CHAR_TO_BYTE = 1;
    private static final String[] converterPrefix;
    private static SoftReference[] classCache;
    static /* synthetic */ Class class$sun$io$Converters;

    private static String getConverterPackageName() {
        final String converterPackageName = Converters.converterPackageName;
        if (converterPackageName != null) {
            return converterPackageName;
        }
        String converterPackageName2 = AccessController.doPrivileged((PrivilegedAction<String>)new GetPropertyAction("file.encoding.pkg")); …
Run Code Online (Sandbox Code Playgroud)

java java-9 java-11

3
推荐指数
1
解决办法
5991
查看次数

从微秒创建 Java DateTime Instant

自 Java 9 以来 Java 日期和时间 API 发生了变化。 LocalDateTime 现在具有微秒精度。

Java 9 具有 java.time.Clock 的全新实现,能够以比毫秒(十进制小数的三位数字)更精细的分辨率捕获当前时刻。

我们从后端服务中获得以微秒为单位的时间。

System.currentTimeMillis  > 1565245051795    > 2019-08-08T06:17:31.795
Service.getTime           > 1565245051795306 > 2019-08-08T06:17:31.795306
Run Code Online (Sandbox Code Playgroud)

为了构造在我们的应用程序中使用的 LocalDateTime,我们执行

long timeMicros = service.getTime();
long timeMillis = timeMicros / 1000;
LocalDateTime ldt = Instant.ofEpochMilli(timeMillis).atZone(ZoneId.systemDefault()).toLocalDateTime();
Run Code Online (Sandbox Code Playgroud)

为了查询服务,我们再次需要时间微秒,然后我们做

long timeMillis = dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
long timeMicros = timeMillis * 1000;
Run Code Online (Sandbox Code Playgroud)

问题是我们没有取回时间微秒的精度。

是否可以创建具有微秒精度的 Instant ?
我们现在使用的是 Java 11。当我们的一个 JUnit 测试由于增加的微秒精度而失败时,我注意到了这一变化。

对于 JUnit 测试,我找到了一个解决方法:

private static final LocalDateTime START = LocalDateTime.now().truncatedTo(ChronoUnit.MILLIS);
Run Code Online (Sandbox Code Playgroud)


我不确定这是一种解决方法还是实际的解决方案,但添加时间戳的最后三微秒数字似乎有效。

System.currentTimeMillis  > 1565245051795    > 2019-08-08T06:17:31.795
Service.getTime           > …
Run Code Online (Sandbox Code Playgroud)

java java-time java-9 java.time.instant java-11

3
推荐指数
1
解决办法
2651
查看次数

使用 Selenium 和 Java 9 执行自动化测试时发生非法反射访问操作

我的硒测试有一个奇怪的问题

当我打开我的 chrome 浏览器时,我收到 2 个错误:

[1569419754.430][WARNING]: Timed out connecting to Chrome, retrying...
[1569419759.899][WARNING]: Timed out connecting to Chrome, retrying...
Run Code Online (Sandbox Code Playgroud)

在浏览器实际打开之前。我还注意到在测试结束时有很多警告:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.openqa.selenium.os.ProcessUtils 
WARNING: Please consider reporting this to the maintainers of org.openqa.selenium.os.ProcessUtils
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Run Code Online (Sandbox Code Playgroud)

我尝试更新 maven 依赖项:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但是它破坏了我所有的测试,我无法初始化浏览器,还有其他人有这个问题吗?

java selenium selenium-webdriver java-9 java-module

3
推荐指数
1
解决办法
9676
查看次数

Gson 的意外行为

我开发了一个存储来自设备的数据的小应用程序:我选择以 Json 格式存储数据,数据的序列化/反序列化工作得很好,即使它涉及我创建的一些自定义类型......但只有我在IDE(Eclipse,就此而言)中工作。

但是当我导出一个可运行的 jar 时,数据的反序列化遇到了某种问题,因为软件总是抛出这个异常:

Caused by: java.lang.UnsupportedOperationException: Cannot allocate class LocalDateTime
    at com.google.gson.internal.UnsafeAllocator$4.newInstance(UnsafeAllocator.java:104)
    at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:225)
    ... 88 common frames omitted
Run Code Online (Sandbox Code Playgroud)

我以为我会遇到自定义类型的问题,而不是内置类型。此时,我发现了两件事:

  • 如果我使用完整的 JRE9 来运行 jar,则不会引发异常:我仔细检查了使用 Jlink.exe 创建的自定义 JRE 中包含的模块,并且所有内容都正确包含。我仍然想使用较小的 JRE,所以我还没有进一步调查(我想这解释了为什么在 IDE 中它可以完美运行)
  • 我向 GSON 对象添加了一个自定义反序列化器(见下文),我只是手动将 JSON 字符串转换为有效数据,从而避免了 LocalDateTime 类上的异常......但异常再次出现在另一个类上,这时间是定制的。

在这一点上,我想我可以简单地为导致问题的每种数据类型添加一个反序列化器,但我想知道为什么这个问题不会在完整的 JRE 中发生,以及为什么较小的 JRE 会导致这个问题,即使所有模块必需的都包括在内。也许值得一提的是,我没有向保存数据的 Gson 对象添加自定义序列化程序,它全部按照 GSON 默认进行序列化。

LocalDateTime 解串器:

    @Override
    public LocalDateTime deserialize(JsonElement json, java.lang.reflect.Type type,
                JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {

        JsonObject joDate = json.getAsJsonObject().get("date").getAsJsonObject();
        JsonObject joTime = json.getAsJsonObject().get("time").getAsJsonObject();
        //JSON example: {"date":{"year":2019,"month":1,"day":9},"time":{"hour":6,"minute":14,"second":1,"nano":0}               
        return LocalDateTime.of(joDate.get("year").getAsInt(),
                joDate.get("month").getAsInt(), …
Run Code Online (Sandbox Code Playgroud)

json jlink gson java-9 jdeps

3
推荐指数
1
解决办法
285
查看次数

如何在JavaFX 9中的TableView中查找可见行的索引

如何在JavaFX 9的TableView中获取可见行的索引?在JavaFX 8中,我可以执行以下操作:

  // --- The offending imports in Java 9
  // import com.sun.javafx.scene.control.skin.TableViewSkin;
  // import com.sun.javafx.scene.control.skin.VirtualFlow;

  /**
   * This is a total hack. We need it as scrollTo jumps the selected
   * row to the top of the table. Jarring if the row is already 
   * visible. As a workaround, we only scroll if the row isn't already
   * visible
   *
   * @return A 2 element ray with the start and end index of visible rows
   */
  public int[] …
Run Code Online (Sandbox Code Playgroud)

java java-9 javafx-9

2
推荐指数
1
解决办法
1618
查看次数

Java:子线程可以比主线程更活跃

我在Java中了解到:子线程不会比主线程更活跃,但是,看起来,这个应用程序的行为显示出不同的结果.

子线程继续工作,而主线程已完成工作!

这是我做的:

public class Main {

public static void main(String[] args) {

    Thread t = Thread.currentThread();

    // Starting a new child thread here
    new NewThread();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("\n This is the last thing in the main Thread!");


    }
}

class NewThread implements Runnable {

private Thread t;

NewThread(){
    t= new Thread(this,"My New Thread");
    t.start();
}

public void run(){
    for (int i = 0; i <40; i++) {
        try {
            Thread.sleep(4000);
            System.out.printf("Second …
Run Code Online (Sandbox Code Playgroud)

java java-9

2
推荐指数
1
解决办法
114
查看次数

为什么java 9用户应该切换到java 10?

我想尝试一下java SE 9(模块系统快速入门指南)http://openjdk.java.net/projects/jigsaw/quick-start提供的一些功能,当我尝试下载Java SE 9 jdk时得到这个声明"Java SE 9已经到了支持终止.Java SE 9的用户应该切换到Java SE 10"为什么会这样,我应该离开java 9吗?谁能给我一个技术解释.谢谢

java java-9

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

为什么在Java 9中不推荐使用finalize()方法?

(此问题不同于您为什么要实现finalize()?此问题与从Java平台弃用有关,另一个问题与在应用程序中是否应使用此机制有关。)

为什么finalize()在Java 9中不推荐使用该方法?

是的,它可能以错误的方式使用(例如,从垃圾收集中保存对象(尽管仅一次)或尝试关闭其中的某些本机资源(比完全不关闭更好))以及许多其他方法可能会被错误地使用。

那么,finalize()真的有这么危险的或绝对无用,它是必要踢出来的Java?

java finalize java-9

2
推荐指数
1
解决办法
393
查看次数