jdk11启动jdk8 jar包报错

文章讲述了在使用jdk11启动由jdk8开发的服务时遇到NoClassDefFoundError,原因在于缺失JAXB依赖。提供了解决方案,即在pom.xml中添加相关jaxb及其依赖,并推荐使用jdk8环境启动以避免问题。

 一、前言

     开发使用jdk8版本开发的服务打包后,使用jdk11版本的java启动服务,导致出现以下报错

     java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

二、解决 

   主要是缺少了依赖,jdk8版本是有jaxb的依赖,但是jdk11没有,需要手动添加,或者更改使用jdk8环境启动服务

   这里就说一下手动增加依赖的解决方案

   在pom.xml配置文件中增加以下配置

   vi pom.xml

<dependency>
   <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

再次启动jar包服务就不会出现报错的情况

其实更改jdk环境更方便一点

<think>我们正在讨论的问题是:Linux系统没有安装JDK能否运行JAR? 根据引用[5]提到的方法,可以在没有全局安装JDK的情况下运行JAR。具体做法是使用一个含JRE(Java运行时环境)的本地目录,然后通过相对路径调用该目录中的java可执行文件来运行JAR。 因此,答案是:可以,但需要有一个可用的Java运行时环境(JRE),即使它不是全局安装的。我们可以将JRE放在与JAR相同的目录或指定目录下,然后通过脚本启动。 具体步骤: 1. 获取JRE:可以从其他机器拷贝一个JRE目录(例如jre8_202),或者从Oracle官网下载并解压(注意授权问题)。 2. 将JRE目录放在与JAR相同的目录(或者指定目录)。 3. 编写启动脚本(startup.sh),通过相对路径或绝对路径调用JRE中的java程序来运行JAR。 示例脚本(startup.sh): ```bash #!/bin/bash # 使用当前目录下的jre8_202/bin/java来运行当前目录下的demo.jar ./jre8_202/bin/java -jar demo.jar --server.port=8899 ``` 或者,如果希望脚本更通用,可以这样写: ```bash #!/bin/bash # 假设JRE目录名为jre,位于与脚本相同的目录 JRE_HOME=$(dirname "$0")/jre $JRE_HOME/bin/java -jar "$(dirname "$0")/your_app.jar" "$@" ``` 注意: - 需要给脚本执行权限:`chmod +x startup.sh` - 这种方式不需要设置全局的JAVA_HOME环境变量,因为直接指定了java可执行文件的路径。 - 这种方法适用于临时运行或无法安装全局JDK/JRE的环境,但要注意JRE的版本需要与JAR编译的Java版本兼容。 引用[5]中的示例是在Windows下使用bat脚本,但同样适用于Linux(使用.sh脚本)。 因此,总结回答: 在Linux系统没有安装全局JDK的情况下,可以通过以下方式运行JAR: 1. 准备一个JRE(可以是解压版的JRE,例如从Oracle官网下载的压缩解压到目录)。 2. 将JRE目录放在与JAR相同的目录(或指定目录)。 3. 编写启动脚本,通过相对路径或绝对路径调用JRE中的java程序来运行JAR。 但是,这种方法并不是完全“不需要JDK/JRE”,而是使用了本地目录中的JRE,避开了系统全局安装。 另外,引用[3]中提到了通过脚本动态设置环境变量(JAVA_HOME)来运行JAR,但前提是系统中已经安装了JDK(只是没有全局设置环境变量)。而我们讨论的是完全没有安装的情况,所以引用[5]的方法更直接。 所以,最终结论:没有安装JDK(即没有在系统中安装Java环境)则不能直接运行JAR,但可以通过提供本地JRE的方式运行,而无需系统级的安装。 注意:如果使用OpenJDK,也可以下载解压版的OpenJDK JRE,方法类似。 相关问题: 1. 如何获取适用于Linux的JRE解压版? 2. 如何确保JRE版本JAR要求的Java版本兼容? 3. 在Linux中如何通过脚本设置临时的环境变量来运行Java程序? 4. 使用本地JRE运行JAR与系统安装JDK运行有何区别?</think>### Linux系统没有安装JDK能否运行JAR? **不能直接运行**,但可以通过以下两种替代方案实现: #### ❌ 直接运行不可行原因 JAR本质上是Java字节码文件(`.class`的压缩),必须通过**Java虚拟机(JVM)**执行。没有JVM环境时,系统会报错: ```bash $ java -jar app.jar bash: java: command not found ``` #### ✅ 替代解决方案 ##### 方案1:使用便携式JRE(无需系统级安装) 参考引用[5]的方法,将JRE与JAR捆绑部署: ```bash # 目录结构 ├── jre8 # 解压后的JRE目录 └── app.jar # 应用程序 ``` 创建启动脚本 `start.sh`: ```bash #!/bin/bash # 使用本地JRE运行JAR ./jre8/bin/java -jar app.jar --server.port=8080 ``` > **优点**:无需系统权限,绿色部署 > **缺点**:需确保JRE版本JAR编译版本兼容 ##### 方案2:动态查找已存在JDK(需系统有JDK) 参考引用[3],通过脚本自动查找JDK路径: ```bash #!/bin/bash # 自动查找JDK11路径 JAVAPATH=$(find / -name jdk-11* -type d | head -n 1) export JAVA_HOME=$JAVAPATH export PATH=$JAVA_HOME/bin:$PATH # 运行JAR java -jar app.jar ``` > **适用场景**:系统存在JDK但未配置环境变量 #### 关键对比 | 方案 | 是否需要JDK | 是否需要root权限 | 部署复杂度 | |--------------------|-------------|------------------|------------| | 便携式JRE | ❌ | ❌ | ★★☆☆☆ | | 动态查找JDK | ✅ | ❌ | ★★★☆☆ | | 系统安装JDK(推荐) | ✅ | ✅ | ★★★★★ | > **生产建议**: > 长期运行的服务强烈建议通过 `apt` 或 `yum` 安装完整JDK(参考引用[1][4]),以确保: > 1. 系统级环境变量支持 > 2. 安全更新维护 > 3. 服务托管能力(systemd)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值