COMPILATION ERROR : package jdk.nashorn.internal.parser does not exist

 

起因:maven编译的时候报import的某个包不存在,所以导致编译错误

解决方法: 如果import的那个包没有使用的话就把import这个语句注释掉,如果有用的话就倒入import的包

下面是报错截图:

 

转载于:https://www.cnblogs.com/zhaijing/p/7272931.html

<think>我们面对的问题是在Maven编译项目hengxingtoc时出现两个错误: 1. package jdk.nashorn.internal.runtime.regexp.joni does not exist 2. static import only from classes and interfaces 首先,我们需要分析这两个错误的原因: 第一个错误:`package jdk.nashorn.internal.runtime.regexp.joni does not exist` 这个错误表明代码中引用了`jdk.nashorn.internal.runtime.regexp.joni`包,但编译器找到。这个包是Nashorn JavaScript引擎的一部分,位于JDK内部。在较新的JDK版本(如JDK11及以上)中,Nashorn已经被标记为废弃,并在某些版本中被移除。因此,如果项目依赖了Nashorn的内部API,而在编译时使用的JDK版本中这些API存在或被移除,就会出现这个错误。 第二个错误:`static import only from classes and interfaces` 这个错误通常是因为静态导入(static import)了一个是静态成员的内容。静态导入的语法是`import static ...`,后面必须跟一个类的静态成员(如静态方法或静态变量)。如果尝试导入非静态成员,或者导入的路径指向的是一个类或接口,就会报这个错误。这个错误可能是由于代码错误或者依赖缺失导致的,但结合第一个错误,很可能是由于缺少Nashorn相关包导致某些类无法解析,进而导致静态导入失败。 因此,主要问题在于项目依赖了JDK内部的Nashorn API,而当前使用的JDK版本可能已经移除了这些API。 解决方案: 1. **检查JDK版本**:确认当前项目使用的JDK版本。如果使用的是JDK11或更高版本,那么Nashorn内部的API可能已经可用。 2. **替换依赖**:避免使用JDK内部的Nashorn API。如果项目需要使用正则表达式功能,可以考虑使用其他正则库,比如`joni`(这是Nashorn内部使用的正则库,但它是独立的)或者Java标准库中的`java.util.regex`。 - 如果项目确实使用了`joni`,可以尝试添加`joni`的依赖到项目中。在Maven的pom.xml中添加: ```xml <dependency> <groupId>org.jruby.joni</groupId> <artifactId>joni</artifactId> <version>2.1.31</version> <!-- 请检查最新版本 --> </dependency> ``` 然后,将代码中导入的`jdk.nashorn.internal.runtime.regexp.joni`替换为`org.joni`(joni库的包名)。 3. **调整代码**:如果项目只是使用了Nashorn的正则表达式功能,那么切换到`joni`库后,代码可能需要一些调整,因为包名和类名发生了变化。但两者的API应该是相似的,因为Nashorn内部就是使用的joni。 4. **检查静态导入**:在第一个问题解决后,第二个错误可能也会随之解决,因为静态导入失败可能是由于找到类导致的。如果第二个错误仍然存在,则检查代码中静态导入的语句,确保导入的是类的静态成员,并且该类在类路径上可用。 5. **降级JDK推荐)**:如果项目暂时无法修改代码,可以考虑降级到JDK8(NashornJDK8中是完整包含的)。但这是长期解决方案,因为Nashorn在更高版本中被移除。 具体步骤: 步骤1:确定当前JDK版本 在项目根目录下执行: ```bash mvn -v ``` 查看JDK版本。 步骤2:修改pom.xml,添加joni依赖(如果决定替换) 如果确定要使用独立的joni库,则在pom.xml的`<dependencies>`部分添加上述依赖。 步骤3:修改代码 将代码中所有导入`jdk.nashorn.internal.runtime.regexp.joni`的语句替换为`org.joni`及其相应的类。例如: 原导入可能是: ```java import jdk.nashorn.internal.runtime.regexp.joni.Regex; import jdk.nashorn.internal.runtime.regexp.joni.Matcher; ``` 替换为: ```java import org.joni.Regex; import org.joni.Matcher; ``` 注意:类名可能完全相同,需要查阅joni库的API文档。 步骤4:重新编译 使用`mvn clean compile`重新编译项目,观察错误是否解决。 如果第二个错误(静态导入错误)在第一个错误解决后仍然存在,那么需要单独检查静态导入的语句。例如,检查是否有这样的语句: ```java import static some.package.SomeClass.someStaticMember; ``` 确保`some.package.SomeClass`存在并且`someStaticMember`是一个静态成员。 另外,静态导入的类可能因为缺少依赖而找到,从而导致这个错误。所以,在第一个问题解决后,第二个问题可能自然解决。 如果问题仍然存在,请提供具体的静态导入语句,以便进一步分析。 考虑到项目名为hengxingtoc,它可能是一个特定的项目,如果有代码仓库可以参考,可能会有更具体的信息。 最后,关于Maven编译的JDK版本,也可以在pom.xml中通过Maven编译器插件指定: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <!-- 或所需的版本 --> <target>1.8</target> </configuration> </plugin> </plugins> </build> ``` 但是,如果项目代码中使用了Nashorn内部API,即使指定了JDK1.8,在更高版本的JDK上编译仍然可能失败(因为编译时使用的是高版本JDK,它没有这些内部API)。所以,建议使用替换依赖的方法。 总结: 主要问题是使用了JDK内部的API,而这些API在新版本中被移除。解决方案是替换为独立的第三方库(如joni)并修改相应的导入。 如果按照上述步骤操作后问题依然存在,请检查是否有其他依赖问题或提供具体的错误代码片段。 §§相关问题§§ 1. 如何在Maven中指定JDK版本? 2. 如何替换已被废弃的JDK内部API? 3. 如何在Java项目中使用joni正则表达式库? 4. Maven编译时出现静态导入错误的原因有哪些? 引用说明:本文中关于NashornJDK11中被废弃的信息参考了Oracle官方文档[^1]。 </think>针对 Maven 编译项目 `hengxingtoc` 时出现的两个错误,我将分步说明解决方案: ### 错误一:`package jdk.nashorn.internal.runtime.regexp.joni does not exist` **原因分析**: JDK 9+ 移除了 Nashorn JavaScript 引擎的内部 API 包 `jdk.nashorn.internal`[^1]。如果项目中直接引用了这些内部包(如 `jdk.nashorn.internal.runtime.regexp.joni`),在 JDK 11+ 编译时会报错。 **解决方案**: 1. **替换正则引擎依赖** 在 `pom.xml` 中添加独立的 Joni 正则库: ```xml <dependency> <groupId>org.jruby.joni</groupId> <artifactId>joni</artifactId> <version>2.2.1</version> <!-- 最新版本 --> </dependency> ``` 2. **修改代码导入路径** 全局替换源码中的包导入路径: ```diff - import jdk.nashorn.internal.runtime.regexp.joni.*; + import org.joni.*; ``` 3. **检查兼容性适配** Joni API 与 Nashorn 内部 API 高度兼容,但需验证以下关键类: ```java // 原类 → 新类 jdk.nashorn.internal.runtime.regexp.joni.Regex → org.joni.Regex jdk.nashorn.internal.runtime.regexp.joni.Matcher → org.joni.Matcher ``` --- ### 错误二:`static import only from classes and interfaces` **原因分析**: 此错误通常由两种原因导致: 1. 静态导入的类缺失(由第一个错误连锁引发) 2. 错误地尝试从非静态成员或枚举进行静态导入 **解决方案**: 1. **修复依赖后重新编译** 完成第一个错误的修复后,此错误可能自动消失。 2. **检查静态导入语法** 定位报错文件中的静态导入语句,确保: ```java // 正确示例(导入类的静态成员) import static java.lang.Math.PI; // 错误示例(能导入非静态成员) import static com.example.NonStaticClass.method; ``` 3. **验证导入目标有效性** 使用 IDE 的跳转功能检查导入目标: - 按住 `Ctrl` + 点击导入的类/方法名 - 若能跳转到源码,说明路径有效 - 若失效则需修正引用路径 --- ### 完整操作流程 1. **修改 `pom.xml` 添加依赖** 2. **全局替换源码中的包路径** 3. **清理并重新编译**: ```bash mvn clean compile -DskipTests ``` 4. **检查静态导入语句** 若错误仍未解决,使用以下命令定位问题文件: ```bash grep -r "import static" src/ # 搜索所有静态导入 ``` --- ### 预防措施 1. **JDK 版本管理** 在 `pom.xml` 中锁定 JDK 版本: ```xml <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> ``` 2. **禁止使用 JDK 内部 API** 添加编译时检测插件: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <compilerArgs> <arg>--add-exports</arg> <!-- 按需开放模块 --> </compilerArgs> </configuration> </plugin> ``` > 关键引用:NashornJDK 11 起被标记为废弃(JEP 335)[^1],JDK 15 正式移除(JEP 372)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值