返回

解决 M3 芯片 Mac 上 JavaFX 启动失败及 Assertion 错误

java

解决 M3 芯片 Mac 上 JavaFX 启动失败并出现 'AssertionFailure' 错误的问题

在 M3 芯片的 Mac 上运行 JavaFX 程序时,可能会遇到 AssertionFailure 错误和 "java quit unexpectedly" 的提示。这个问题通常与 JavaFX 和 macOS 的兼容性以及 M3 芯片的架构有关。下面将分析可能的原因并提供解决方案。

1. 检查 JDK 和 JavaFX 版本兼容性

首先要确保使用的 JDK 版本与 JavaFX 兼容。某些 JDK 版本可能与特定版本的 JavaFX 存在兼容性问题,特别是在新的 M3 芯片架构上。

解决方案:

  • 使用 Azul Zulu JDK : Azul Zulu JDK 提供了对 ARM64 架构的良好支持,并且通常与 JavaFX 配合良好。

    • 操作步骤 :
      1. 从 Azul Zulu 官网下载适用于 macOS ARM64 架构的 JDK 版本: Azul Zulu Downloads
      2. 安装下载的 JDK。
      3. 在 IntelliJ IDEA 中配置项目 SDK,指向安装的 Zulu JDK。 (File -> Project Structure -> Project Settings -> Project -> SDK; and SDKs).
      4. 确保 Maven 或 Gradle 使用的是Zulu JDK。(可以根据 IDE 配置)
      5. 重新构建并运行项目。
  • 使用 SDKMAN! 管理 JDK 版本: SDKMAN! 可以方便地安装、切换和管理多个 JDK 版本,可以尝试使用不同的 JDK 版本来测试兼容性。

    • 安装 SDKMAN!:

      curl -s "https://get.sdkman.io" | bash
      
    • 安装 Azul Zulu JDK:

      sdk install java 21.0.1-zulu
      
    • 使用特定 JDK :

      sdk use java 21.0.1-zulu
      
  • 验证 JavaFX SDK:

    确保在项目中正确引入了 JavaFX SDK。如果使用Maven,确保 pom.xml 中有正确的依赖配置。例如:

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>21</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>21</version>
        </dependency>
          <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>21</version>
            <classifier>${os.detected.classifier}</classifier>
        </dependency>
    
    </dependencies>
    <build>
        <plugins>
                <plugin>
                        <groupId>org.openjfx</groupId>
                        <artifactId>javafx-maven-plugin</artifactId>
                        <version>0.0.8</version>
                        <configuration>
                          <mainClass>YourMainClass</mainClass>
                                <jlinkImageName>YourAppName</jlinkImageName>
                         <jlinkZipName>YourAppName</jlinkZipName>
                         <jlinkExecutable>YourAppName</jlinkExecutable>
                            <compress>2</compress>
                             <stripDebug>true</stripDebug>
                              <noHeaderFiles>true</noHeaderFiles>
                                 <noManPages>true</noManPages>
                            <launcher>app</launcher>
                            <jlinkModules>
                                <jlinkModule>java.desktop</jlinkModule>
                            <jlinkModule>javafx.base</jlinkModule>
                                <jlinkModule>javafx.controls</jlinkModule>
                            <jlinkModule>javafx.fxml</jlinkModule>
                           <jlinkModule>javafx.graphics</jlinkModule>
                                <jlinkModule>${module.name}</jlinkModule>
                             </jlinkModules>
                       <classifier>${os.detected.classifier}</classifier>
                      </configuration>
                         <dependencies>
                              <dependency>
                               <groupId>org.openjfx</groupId>
                               <artifactId>javafx-base</artifactId>
                                <version>21</version>
                            <classifier>${os.detected.classifier}</classifier>
                           </dependency>
                        <dependency>
                                 <groupId>org.openjfx</groupId>
                               <artifactId>javafx-graphics</artifactId>
                              <version>21</version>
                              <classifier>${os.detected.classifier}</classifier>
                               </dependency>
                            </dependencies>
                     </plugin>
            <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                       <version>3.11.0</version>
                        <configuration>
                            <source>21</source>
                            <target>21</target>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                       <artifactId>maven-shade-plugin</artifactId>
                      <version>3.5.0</version>
                         <executions>
                            <execution>
                                 <goals>
                                     <goal>shade</goal>
                                 </goals>
                               <phase>package</phase>
                              <configuration>
                                   <transformers>
                                   <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                             <mainClass>YourMainClass</mainClass>
                                       </transformer>
                                 </transformers>
                                   <createDependencyReducedPom>false</createDependencyReducedPom>
                                    <filters>
                                    <filter>
                                      <artifact>*:*</artifact>
                                       <excludes>
                                          <exclude>META-INF/*.SF</exclude>
                                          <exclude>META-INF/*.DSA</exclude>
                                          <exclude>META-INF/*.RSA</exclude>
                                      </excludes>
                                   </filter>
                                  </filters>
                              </configuration>
                          </execution>
                        </executions>
                 </plugin>
    
                     <plugin>
                         <groupId>org.codehaus.mojo</groupId>
                         <artifactId>exec-maven-plugin</artifactId>
                        <version>3.1.1</version>
                         <configuration>
                             <mainClass>YourMainClass</mainClass>
                        </configuration>
                    </plugin>
             <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jar-plugin</artifactId>
                       <version>3.3.0</version>
                      <configuration>
                         <archive>
                           <manifest>
                             <addClasspath>true</addClasspath>
                              <mainClass>YourMainClass</mainClass>
                            </manifest>
                        </archive>
                       </configuration>
                   </plugin>
             <plugin>
               <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.6.0</version>
               <configuration>
                    <archive>
                        <manifest>
                              <mainClass>YourMainClass</mainClass>
                          </manifest>
                     </archive>
                    <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                   </descriptorRefs>
                     <appendAssemblyId>false</appendAssemblyId>
                       </configuration>
                        <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                              <goal>single</goal>
                          </goals>
                      </execution>
                  </executions>
                </plugin>
    
                  <plugin>
                   <groupId>kr.motd.maven</groupId>
                       <artifactId>os-maven-plugin</artifactId>
                   <version>1.7.1</version>
                     <executions>
                       <execution>
                       <goals>
                            <goal>detect</goal>
                       </goals>
                     </execution>
                    </executions>
                </plugin>
    
                  </plugins>
    </build>
    
    

    YourMainClass 替换为你的主类, 并根据你的项目情况修改依赖。 之后请更新你的 maven 依赖 mvn clean install.

2. 添加 VM 选项解决 NSTrackingRectTag 问题

NSTrackingRectTag 相关的错误通常与 JavaFX 在 macOS 上的事件处理有关。 可以尝试添加一些 VM 选项来解决这个问题。

解决方案:

  • 在 IntelliJ IDEA 中配置 VM 选项:

    • 操作步骤:

      1. 打开 "Run/Debug Configurations"。
      2. 选择你的应用程序配置。
        3