JavaFX 11使用 EasyExcel 模块化坑人问题

需求: 我的JDK版本是JDK17,需要用JavaFX 11和EasyExcel开发一个窗体应用。

由于IDEA限制,JavaFX 11以上版本的项目创建必须要求JDK版本高于JDK9,而JDK9引入了模块化,从而遇到了一系列问题。下面我将一步步重现我的问题,并给出解决方案。

一、POM下添加EasyExcel依赖

	<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.5</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>5.1.1</version>
        </dependency>
    </dependencies>

注意lombok需要idea额外下载插件lombok才能使用。导入依赖后,需要在"module-info.java"文件中引入模块。

二、module-info.java下添加模块

module com.example.javafx_maven {
    requires javafx.controls;
    requires javafx.fxml;
    requires java.desktop;
    requires lombok;
    requires easyexcel.core;

    opens com.example.javafx_maven to javafx.fxml;
    exports com.example.javafx_maven;
}

三、编写测试代码读取Excel文件

package com.example.javafx_maven;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class Product {
    @ExcelProperty("物料编码")
    String material_code;
}

Excel表:

在这里插入图片描述

表中有6条属性,测试类使用"物料编码"属性进行测试。

读取Excel文件

String filename = "D:\\workspaces\\javafx_workspace\\gk_poms\\data\\吉曼编码文件.xlsx";
EasyExcel.read(filename, Product.class, new AnalysisEventListener() {
	@Override
	public void invoke(Object o, AnalysisContext analysisContext) {
		System.out.println((Product) o);
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
		System.out.println("完毕");
	}
}).sheet().doRead();

运行报错

在这里插入图片描述

Caused by: java.lang.IllegalAccessException: module 
com.example.javafx_maven does not open com.example.javafx_maven to 
unnamed module @7f60ea4f

按照英文翻译过来是: 我们自己的模块没有向未命名模块开放
解决办法也简单,直接在IDEA 中配置 VM OPTION 让我们包的代码对所有未命名模块开放。

--add-opens com.example.javafx_maven/com.example.javafx_maven=ALL-UNNAMED

然后再次运行,又报了个新的错误:

Caused by: java.lang.IllegalAccessError: superclass access check failed:
class com.example.javafx_maven.Product$$BeanMapByEasyExcelCGLIB$$837da033 
(in module com.example.javafx_maven) cannot access class 
com.alibaba.excel.support.cglib.beans.BeanMap (in unnamed module 
@0x307558ca) because module com.example.javafx_maven does not read 
unnamed module @0x307558ca

按照英文翻译过来是: 超类访问失败,无法访问alibaba.excel.support,因为我们自己的模块没有读取未命名模块
解决办法也简单,再添加一条 VM OPTION 让我们的模块读取所有未命名模块。

--add-reads com.example.javafx_maven=ALL-UNNAMED

两条 VM OPTION 中间用空格隔开

再次运行

在这里插入图片描述
成功读取数据。

折腾了一天终于把EasyExcel模块化跑起来了,但是我已经不需要了哈哈哈。时间催得紧,直接用POI手写数据解析器做完了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java 11开始,JavaFX与JDK分开发布。下载JavaFX 11需要进行以下步骤: 1. 首先,点击此处下载与你的JDK版本对应的JavaFX安装包。 2. 下载完成后,解压缩文件并记住文件路径。 3. 打开Eclipse,点击菜单栏的"Window",选择"Preferences"。 4. 在Preferences窗口中,找到Java选项,并展开它。 5. 单击"Build Path",然后选择"User Libraries"。 6. 点击"New"创建一个新的库,并为其命名为"JavaFX11"。 7. 在JavaFX11库中,点击"Add External JARs",选择解压后的JavaFX文件夹中的"lib"文件夹,并添加所有的.jar文件。 8. 然后点击"Add External Class Folder",选择解压后的JavaFX文件夹中的"src"文件夹,并添加该文件夹。 9. 完成以上步骤后,点击"Apply and Close"保存设置。 这样,你就已经成功下载了JavaFX 11,并将其与你的JDK集成在一起。现在你可以在Eclipse中创建JavaFX项目并使用JavaFX的功能了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java11 以后的JavaFX 安装教程 eclipse 手把手 最详细 菜鸟教程](https://blog.csdn.net/weixin_45714844/article/details/106567308)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [JDK11之后安装JavaFX的一些问题及解决办法](https://blog.csdn.net/m0_56806689/article/details/121501052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值