【问题标题】:Migrate to openJDK 13 and openJFX 13迁移到 openJDK 13 和 openJFX 13
【发布时间】:2019-10-13 21:14:44
【问题描述】:

我不得不切换到来自 JDK8 的 openJDK,但我无法使用 maven 编译我的程序。 这对我来说是新的,经过几天的谷歌搜索后,我对这些版本比以前更加困惑了。

我没找到:

  • 我应该使用最新版本的 openJDK 吗? (目前是 13 岁)
  • openJFX 是否必须与 openJDK 的版本相匹配?
  • Maven:我是否必须使用 13 编译它的源和目标,或者是否可以使用 1.8 与 JRE1.8 兼容

这是我在 Eclipse 中所做的

  • 将 openJDK 13 导入 eclipse 并设置为默认 JDK。
  • 将 pom.xml 更新为 maven 编译器 3.8.1 并将源和目标设置为 13。
  • 添加了 openJFX 13 依赖项

当我从 GIT 新导入项目时,它运行时没有任何错误。 在我通过 Maven 编译或更新项目后,我得到了一堆不同的错误,并且程序不再可运行。 我注意到每次更新时,maven 都会将我的项目 JRE 设置为 [J2SE-1.5]。如何防止这种情况发生?

这真的很奇怪。在 Class 中,我得到编译器错误,无法找到某些东西,但在我的包资源管理器中,一切似乎都很好:

Snapshot

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>IBE_Calculator</groupId>
  <artifactId>IBE_Calculator</artifactId>
  <version>IBE</version>


  <build>
    <sourceDirectory>src</sourceDirectory>
    <resources>
      <resource>
        <directory>src</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>

      <resource>
        <directory>main/resources</directory>
        <includes>
            <include>IBEDB.sqlite</include>        
        </includes>
      </resource>

      <resource>
        <directory>res</directory>
            <excludes>
              <exclude>**/*.java</exclude>
            </excludes>
        </resource>
    </resources>

        <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
              <source>13</source>
              <target>13</target>
            </configuration>
        </plugin>


        <plugin>
             <artifactId>maven-assembly-plugin</artifactId>
             <configuration>
                 <archive>
                     <manifest>
                         <mainClass>main.java.srcMain.Main</mainClass>
                     </manifest>
                 </archive>
                 <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
                 </descriptorRefs>
             </configuration>
             <executions>
                 <execution>
                     <phase>install</phase>
                     <goals>
                         <goal>single</goal>
                     </goals>
                 </execution>
             </executions>
         </plugin>

        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.3</version>
            <configuration>
                <mainClass>main.java.srcMain.Main</mainClass>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/classes/libs2</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>    
    </plugins>
  </build>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>13</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>13</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>13</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6.12</version>
        </dependency>

        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.8.11.2</version>
        </dependency>

        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.jgrapht</groupId>
            <artifactId>jgrapht-ext</artifactId>
            <version>1.0.1</version>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6.12</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.9</version>
        </dependency>

        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>2.5.0</version>
        </dependency>
     </dependencies>

    <name>IBECalc</name>
</project>

我觉得我的代码没有问题,但这是当前错误:

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.Error: Unresolved compilation problems: 
    The method handle(WindowEvent) of type new EventHandler<WindowEvent>(){} must override a superclass method
    The method run() of type new Runnable(){} must override a superclass method

    at srcMain.Main$1.handle(Main.java:42)
    at srcMain.Main$1.handle(Main.java:1)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.stage.Window.fireEvent(Window.java:1368)
    at javafx.stage.Window$12.invalidated(Window.java:1122)
    at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
    at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:145)
    at javafx.stage.Window.setShowing(Window.java:1174)
    at javafx.stage.Window.show(Window.java:1189)
    at javafx.stage.Stage.show(Stage.java:273)
    at srcMain.Main.start(Main.java:74)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    ... 1 more

我从一个新的类中调用我的主类,因为似乎有一个错误。

类NewMain:

package srcMain;

public class NewMain {

    public static void main(String args[] ) throws Exception {
        Main.main(args);
    }
}

主类:

package srcMain;
import java.io.IOException;

import java.sql.SQLException;
import java.text.ParseException;

import SQLite.*;

import javafx.application.*;
import com.sun.javafx.application.*;

import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javafx.event.*;
import javafx.fxml.FXMLLoader;
import javafx.scene.*;



public class Main extends Application{
    static SQLite db;
    public static Boolean isSplashLoaded = false;
    public static Boolean data_fin = false;
    public static Stage parentWindow;
    Stage stage = new Stage();

    @Override
    public void start(final Stage primaryStage) throws Exception{
        /*
         * �ffnet den Loading Screen und startet die Dateneinlesung
         */
        try{

            parentWindow = primaryStage;
            FXMLLoader loader = new FXMLLoader(getClass().getResource("IBE_LoadScreen.fxml"));
            loader.setController(new ControllerLoadScreen());
            Parent root1 = (Parent)loader.load();

            //wenn die GUI angezeigt wird, wird die Dateneinlesung gestartet
            stage.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
                @Override
                public void handle(WindowEvent window){
                    Platform.runLater(new Runnable(){
                        @Override
                        public void run(){
                            try {
                                try {
                                    readData();
                                } catch (ParseException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            } catch (SQLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            data_fin = true;
                        }
                    });
                }
            });

            //wird der Close-Button gefr�ckt, schlie�t sich das gesamte Programm, nicht nur das Fenster
            Platform.setImplicitExit(false);
            stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
                @Override
                public void handle(WindowEvent event) {
                    Platform.exit();
                }
            });
            stage.setResizable(true);
            stage.setTitle("Wegeentgelt-Kalkulator");
            stage.setScene(new Scene(root1));
            stage.show();
        }catch(Exception e){
            System.out.println("Cant load new window");
            e.printStackTrace();
        }

    }


    public void readData() throws SQLException, ParseException {
        /*
         * erstellt ein ExcelHandler Objekt und ruft alle Methoden auf
         * die Daten von den Excel-Files einlesen.
         * 
         * Wenn diese Daten fertig eingelesen wurden, wird die Main-Maske angezeigt.
         */

        db.Hst();
        db.Halte();
        db.Marktsegment();
        db.bstn();
        db.basisdaten();
        db.TFZ();

        db.closeConnection();
        data_fin = true;

        //wenn die Daten eingelesen wurden �ffnet sich die Main-Maske
        if(data_fin){
            FXMLLoader loader = new FXMLLoader(getClass().getResource("IBECalc-Main_1024_768.fxml"));
            loader.setController(new ControllerMain("1024x768"));
            Parent root1;
            try {
                root1 = (Parent)loader.load();
                stage.getScene().setRoot(root1);
                stage.setResizable(true);
                stage.setMinHeight(680);
                stage.setMinWidth(1024);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public static void main(String[] args)  throws SQLException{
        //startet das Programm
        db = new SQLite();

        launch(args);



    }
}

我将项目导入另一个环境,现在出现了一个新错误。找不到启动 GUI 的应用程序类。

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method launch(String[]) is undefined for the type Main

    at srcMain.Main.main(Main.java:123)
    at srcMain.NewMain.main(NewMain.java:6)

【问题讨论】:

  • 能否请您出示您的pom.xml 文件以及minimal reproducible example 例外情况?
  • 发布srcMain.Main类的代码。根据您发布的堆栈跟踪,文件Main.java 中的第 42 行抛出错误。似乎那行代码可能是@Override 注释。
  • 感谢您的信息,我是 stackoverflow 的新手。我试图为你提供你所要求的一切。我认为 @Override 错误是编译器无法找到像 Application 这样的类的结果。我在主帖中附上了一些截图。
  • 尝试删除 @Override 注释 - 它们不是强制性的。 (我认为这不会让事情变得比现在更糟 :-)
  • 你是对的,删除 @override 注释解决了一些编译器问题。其余错误请参见我在主帖中的快照。

标签: java eclipse openjfx


【解决方案1】:

我应该使用最新版本的 openJDK 吗? (目前是 13 岁)

您可以使用当前可用/未终止使用的任何版本。此时(2019 年 10 月):

  • 可以至少在 2020 年 12 月之前继续使用 OpenJDK 8,
  • OpenJDK 9 和 10 现已停产,
  • OpenJDK 11 是最新的 LTS 版本,
  • OpenJDK 12 现已停产,并且
  • OpenJDK 13 是最新版本。

(您甚至可以使用生命周期结束的版本,但这是不可取的,因为不太可能有任何可用的安全补丁。)

OpenJFX 是否必须与 OpenJDK 的版本相匹配?

在 Java 11 之前,这个问题没有实际意义,因为 OpenJFX 与 OpenJDK(或 Oracle JDK 或 JRE)捆绑在一起

所以版本不需要匹配。

Maven:我是否必须使用 13 编译它的源和目标,或者是否可以使用 1.8 与 JRE1.8 兼容

不清楚你在这里问什么。如果您打算在您构建的相同版本平台上运行,那么源版本和目标版本应该与该 Java 版本匹配。作为一般规则,您可以获取在旧平台上构建的类并在新平台上运行它们。 (例外情况是,如果您使用的是已被删除的已弃用的类或方法。)

如果您想在较新的平台上构建并在较旧的平台上运行,则需要设置源版本和目标版本以匹配较旧的平台版本。但这可能还不够。您还需要确保您的代码不依赖于旧运行时库中不支持的新访问类和方法。

同样的原则也适用于 JavaFX 应用程序。如果您希望您的 JavaFX 应用程序在 Java 8 上运行,最好在 Java 8 上构建。如果您在 Java 11 上构建,则需要使用 8 作为源和目标版本,并且您需要限制自己使用仅限 JavaFX 8 API。


您的异常似乎是由尚未更正的编译错误引起的。 您不应该运行带有编译错误的代码。在运行代码之前修复所有编译错误。

最终的编译错误是由于调用了Main 类中不存在的静态方法。其实launch方法是Application的静态方法,所以需要这样调用:

    Application.launch(args);

Java 中不继承静态方法。

【讨论】:

  • 非常感谢斯蒂芬,我离放弃只有一个量子点。
【解决方案2】:

解决方案: 所有编译错误都是由通过 maven currpted OpenJFX 库引起的。我通过删除所有存储库并使用 mvn update project 功能再次导入解决了这个问题。

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 2019-10-07
    • 1970-01-01
    • 2022-08-11
    • 2022-12-14
    • 1970-01-01
    • 2022-01-16
    • 2015-01-20
    • 2019-04-21
    相关资源
    最近更新 更多