1

我正在开发一个 Java 应用程序(一个 Spring Boot 应用程序)。在我的 Ubuntu 开发机器上,我使用了这个 JDK 版本:

andrea@ubuntu:~$ java --version
java 17 2021-09-14 LTS
Java(TM) SE Runtime Environment (build 17+35-LTS-2724)
Java HotSpot(TM) 64-Bit Server VM (build 17+35-LTS-2724, mixed mode, sharing)

这是我的 Spring Boot 应用程序的pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.notariato</groupId>
    <artifactId>UpdateInfoBatch</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>UpdateInfoBatch</name>
    <description>Recupera ed aggiorna le informazioni relative alla lista dei notai ed ai distretti notarili</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.batch</groupId>
            <artifactId>spring-batch-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        
        <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    

    
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        
        
        
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.4.3</version>
        </dependency>
        
    
    
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我获得了.jar应用程序,并且在我的开发机器上运行它没有问题。

当我试图在生产机器上移动这个.jar文件时,问题就发生了。

这里的Java版本如下:

webadmin@webadmin.spaccount.it [~/java/jre1.8.0_311/bin]# ./java -version
java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
webadmin@webadmin.spaccount.it [~/java/jre1.8.0_311/bin]#

所以,如您所见,这里的 JAVA 版本似乎是1.8.0_311

运行我的应用程序,我收到此错误消息:

webadmin@webadmin.spaccount.it [~/java/jre1.8.0_311/bin]# ./java -jar /home/webadmin/notartel-import-data-batch/UpdateInfoBatch-0.0.1-SNAPSHOT.jar
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/notariato/updateInfo/UpdateInfoBatchApplication has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)

看来安装的JRE太旧了。我试图手动下载 JAVA 17 的 JRE 包,但我找不到它。

我要使用什么版本的 JRE?我在哪里可以下载这个 JRE 包版本?(不使用 yum 包管理器,我需要下载包含 JRE 的 tar 文件,然后将其解压缩到我的系统上)。

谢谢

4

1 回答 1

4

自 Java 9 以来,传统的 JRE 不再存在(尽管一些供应商提供类似 JRE 的包)。为了让 Java 运行时运行您的应用程序,您可以使用该jlink工具,它也随 JDK 17 一起提供,对于模块化应用程序如下所示:

jlink -p <directory app jar> --add-modules <name of your module> --output custom_runtime

如果您的应用程序是非模块化的,您将必须找出您需要的模块,例如使用jdeps(也是 JDK 17 附带的工具):

$ mvn dependency:build-classpath -DincludeScope=runtime -Dmdep.outputFile=cp.txt
$ jdeps -classpath "<contents of cp.txt>" --multi-release 17 --print-module-deps --ignore-missing-deps <app jar>

打印类似mod1,mod2,mod3. 将它们传递给--add-modules标志:

jlink --add-modules mod1,mod2,mod3 --output custom_runtime

这将生成一个custom_runtime包含 Java 运行时的文件夹,您可以使用它来运行您的应用程序,然后可以将其部署在目标机器上。

如果您的应用程序是非模块化的,您还必须部署应用程序.jar文件及其所有依赖项(Spring Boot 项目不应有外部运行时依赖项,因为它将所有依赖项捆绑在应用程序 jar 中)。然后,使用java自定义运行时中的可执行文件来运行应用程序:

/path/to/custom/runtime/java -jar <app jar>
于 2021-11-13T22:09:38.600 回答