如何修复 Java 11 + JavaFX Hibernate 模块的 module-info.java

Fra*_*hez 5 java jpa modularity javafx maven

我使用 Java11 创建一个简单的测试应用程序来学习 JPA、Hibernate、一些 java 模块化以及后来的内容(带有 dagger 的 CDI),当我使用 module-info.java 时,我遇到了编译问题

我为一些简单的类完成了一些DAO 存储库,这些类带有 JPA 注释以对其进行测试,并且在我的主类上一切都运行良好,我成功地插入和检索了一些对象。注意:到目前为止我还没有 module-info.java

现在我正在制作一些 FXML(使用 scenebuilder)。我之前已经这样做过,并且必须创建一个 module-info.java 来解决一些 JavaFX 问题(我认为与 java 反射有关):我在另一个项目中这样做了,并且按预期工作。这是由 IntelliJ 警告生成的,IntelliJ 警告要么通过 IntelliJ 解决它们,要么通过某些运行时异常通知我包 app.a 需要打开包 app.b,而我手动执行此操作。这是我第一次使用 module-info.java

因此,当我尝试通过另一个类MainFX与 gui 一起运行时,我收到一些错误(我将尝试解决该错误,但这不是这个问题的目的):

Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x71b9e075) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x71b9e075
    at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38)
    at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.java:2056)
    at app.control.MainControl.loadFXML(MainControl.java:22)
    at app.MainFX.start(MainFX.java:42)
Run Code Online (Sandbox Code Playgroud)


正是在这一点上,我尝试添加 module-info.java 并解决了 IntelliJ 添加一些模块依赖项捕获的所有导入依赖项:


module bartest {
    requires com.google.common;
    requires javafx.controls;
    requires javafx.graphics;
    requires javafx.fxml;
    requires flogger;
    requires java.logging;
    requires java.persistence;


    opens app;

}
Run Code Online (Sandbox Code Playgroud)


但无论我尝试过什么,我都会得到一个java.lang.module.ResolutionException

Information:java: compiler message file broken: key=compiler.misc.msg.bug arguments=11.0.4, {1}, {2}, {3}, {4}, {5}, {6}, {7}
Information:java: java.lang.module.ResolutionException: Module jakarta.activation contains package javax.activation, module java.activation exports package javax.activation to jakarta.activation
Information:java:   at java.base/java.lang.module.Resolver.resolveFail(Resolver.java:885)
Information:java:   at java.base/java.lang.module.Resolver.failTwoSuppliers(Resolver.java:789)
Information:java:   at java.base/java.lang.module.Resolver.checkExportSuppliers(Resolver.java:718)
Information:java:   at java.base/java.lang.module.Resolver.finish(Resolver.java:362)
Information:java:   at java.base/java.lang.module.Configuration.<init>(Configuration.java:130)
Information:java:   at java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:484)
Information:java:   at java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:288)
Information:java:   at jdk.compiler/com.sun.tools.javac.file.JavacFileManager.getServiceLoader(JavacFileManager.java:985)
Information:java:   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Information:java:   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Information:java:   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Information:java:   at java.base/java.lang.reflect.Method.invoke(Method.java:566)
Information:java:   at org.jetbrains.jps.javac.JavacMain$2.invoke(JavacMain.java:290)
Information:java:   at com.sun.proxy.$Proxy24.getServiceLoader(Unknown Source)
Information:java:   at com.sun.proxy.$Proxy25.getServiceLoader(Unknown Source)
Information:java:   at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.initProcessorLoader(JavacProcessingEnvironment.java:261)
Information:java:   at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.<init>(JavacProcessingEnvironment.java:237)
Information:java:   at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.instance(JavacProcessingEnvironment.java:193)
Information:java:   at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.initProcessAnnotations(JavaCompiler.java:1136)
Information:java:   at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:922)
Information:java:   at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
Information:java:   at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:147)
Information:java:   at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
Information:java:   at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
Information:java:   at org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:195)
Information:java:   at org.jetbrains.jps.incremental.java.JavaBuilder.compileJava(JavaBuilder.java:460)
Information:java:   at org.jetbrains.jps.incremental.java.JavaBuilder.compile(JavaBuilder.java:330)
Information:java:   at org.jetbrains.jps.incremental.java.JavaBuilder.doBuild(JavaBuilder.java:255)
Information:java:   at org.jetbrains.jps.incremental.java.JavaBuilder.build(JavaBuilder.java:213)
Information:java:   at org.jetbrains.jps.incremental.IncProjectBuilder.runModuleLevelBuilders(IncProjectBuilder.java:1324)
Information:java:   at org.jetbrains.jps.incremental.IncProjectBuilder.runBuildersForChunk(IncProjectBuilder.java:1004)
Information:java:   at org.jetbrains.jps.incremental.IncProjectBuilder.buildTargetsChunk(IncProjectBuilder.java:1071)
Information:java:   at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunkIfAffected(IncProjectBuilder.java:965)
Information:java:   at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunks(IncProjectBuilder.java:794)
Information:java:   at org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:376)
Information:java:   at org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:178)
Information:java:   at org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:139)
Information:java:   at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:288)
Information:java:   at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:121)
Information:java:   at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler.lambda$channelRead0$0(BuildMain.java:228)
Information:java:   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
Information:java:   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
Information:java:   at java.base/java.lang.Thread.run(Thread.java:834)
Information:java: Errors occurred while compiling module 'bartest'
Information:javac 11.0.4 was used to compile java sources
Information:29/08/2019 4:03 a. m. - Build completed with 1 error and 0 warnings in 4 s 405 ms
Error:java: Compilation failed: internal java compiler error
Run Code Online (Sandbox Code Playgroud)

当我删除 module-info.java 时,我开始成功构建,并且非 javaFX 代码工作正常。我猜测如果没有 module-info.java,module-info 会正确自动生成。

因此,使用我的 module-info.java 它无法编译,没有它确实可以编译,但我无法运行 JavaFX,如果没有 module-info.java 文件,这可能可以解决,但我想知道是什么原因造成的,也可以告诉我对大多数概念(maven、jpa、模块化)相当陌生,我这次测试的目标是学习,所有帮助将不胜感激。

我认为可能影响的其他事情是我缺乏使用 maven pom.xml 文件的经验,我基本上让 Intellij 生成依赖项和插件标签我在互联网上搜索但可能是错误的

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://maven.apache.org/POM/4.0.0"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <artifactId>bartest</artifactId>
  <groupId>com.kurama</groupId>
  <modelVersion>4.0.0</modelVersion>
  <version>1.0-SNAPSHOT</version>
  <name>J_HibernateDaggerTest</name>
  <url>http://maven.apache.org</url>
  <properties>
    <java.version>11.0.4</java.version>
    <hibernate.version>5.3.11.Final</hibernate.version>
  </properties>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <release>${java.version}</release>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
        <groupId>org.apache.maven.plugins</groupId>
        <version>3.8.1</version>
      </plugin>
      <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <configuration>
          <mainClass>app.MainFX</mainClass>
        </configuration>
        <version>0.0.3</version>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.2</version>
        <dependencies>
          <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>6.2</version>
          </dependency>
        </dependencies>
        <configuration>
          <forkCount>0</forkCount>
        </configuration>
      </plugin>
    </plugins>
  </build>


  <dependencies>
    <dependency>
      <artifactId>javafx-controls</artifactId>
      <groupId>org.openjfx</groupId>
      <version>11.0.2</version>
    </dependency>
    <dependency>
      <artifactId>javafx-fxml</artifactId>
      <groupId>org.openjfx</groupId>
      <version>11.0.2</version>
    </dependency>
    <dependency>
      <artifactId>guava</artifactId>
      <groupId>com.google.guava</groupId>
      <version>LATEST</version>
    </dependency>
    <dependency>
      <artifactId>mariadb-java-client</artifactId>
      <groupId>org.mariadb.jdbc</groupId>
      <version>2.4.2</version>
    </dependency>
    <dependency>
      <artifactId>flogger</artifactId>
      <groupId>com.google.flogger</groupId>
      <version>0.4</version>
    </dependency>
    <dependency>
      <artifactId>flogger-system-backend</artifactId>
      <groupId>com.google.flogger</groupId>
      <version>0.4</version>
    </dependency>
    <dependency>
      <artifactId>controlsfx</artifactId>
      <groupId>org.controlsfx</groupId>
      <version>11.0.0</version>
    </dependency>
    <dependency>
      <artifactId>jfxtras-controls</artifactId>
      <groupId>org.jfxtras</groupId>
      <version>10.0-r1</version>
    </dependency>

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>${hibernate.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.1</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jaxb</groupId>
      <artifactId>jaxb-runtime</artifactId>
      <version>2.3.2</version>
    </dependency>
  </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

编辑1:
HERE用户Gili指出:

Eclipse 基金会已接管 JavaEE 开发javax.activation已移至jakarta.activationwiki.eclipse.org/New_Maven_Cooperatives ”

所以我尝试将以下 deps 添加到我的 pom 中

    <dependency>
      <groupId>jakarta.activation</groupId>
      <artifactId>jakarta.activation-api</artifactId>
      <version>1.2.1</version>
    </dependency>
    <dependency>
      <groupId>jakarta.persistence</groupId>
      <artifactId>jakarta.persistence-api</artifactId>
      <version>2.2.2</version>
    </dependency>
    <dependency>
      <groupId>jakarta.transaction</groupId>
      <artifactId>jakarta.transaction-api</artifactId>
      <version>1.3.1</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

在构建时它仍然失败,并且我在模块信息文件上收到警告

Error:java: java.lang.module.ResolutionException: Modules java.activation and jakarta.activation export package javax.activation to module error.prone.annotations
Information:java: java.lang.module.ResolutionException: Modules jakarta.activation and java.activation export package javax.activation to module javafx.webEmpty
Information:java: Errors occurred while compiling module 'bartest'
Information:javac 11.0.4 was used to compile java sources
Information:29/08/2019 4:03 a. m. - Build completed with 1 error and 0 warnings in 4 s 405 ms
Error:java: Compilation failed: internal java compiler error
Run Code Online (Sandbox Code Playgroud)


编辑2:我确实遵循了IntelliJ can't recognize JavaFX 11 with OpenJDK 11 这导致我之前运行 JavaFX 项目,但是当我按照那里的指示添加 module-info.java 时,我得到了上面粘贴的异常。构建时。jakarta.activation显然模块和java.activation导出包都存在一些问题javax.activation,但我不知道如何解决这个问题

Fra*_*hez 5

这个修补代码已经吸引了我......出于文档原因,我将在这里解释

在/sf/answers/3369583871/之后我添加了

    <dependency>
      <groupId>org.glassfish.jaxb</groupId>
      <artifactId>jaxb-runtime</artifactId>
      <version>2.3.2</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

删除这个解决了大问题,唯一缺少的是 module-info.java,在修复所需的模块后现在看起来像这样

module bartest {
    requires com.google.common;
    requires javafx.controls;
    requires javafx.graphics;
    requires javafx.fxml;
    requires flogger;
    requires java.logging;
    requires net.bytebuddy;
    requires java.sql;
    requires java.xml.bind;

    opens app.control to javafx.fxml;
    opens app.model to org.hibernate.orm.core;

    opens app;

}
Run Code Online (Sandbox Code Playgroud)

现在一切正常。