wgzhao / Addax

Addax is a versatile open-source ETL tool that can seamlessly transfer data between various RDBMS and NoSQL databases, making it an ideal solution for data migration.

Home Page:https://wgzhao.github.io/Addax/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Bug]: 数据转换插件 提示找不到Class文件 NoClassDefFoundError

suiquantong opened this issue · comments

What happened?

A bug happened!
使用插件的方式来加载 数据转换插件 放在 /addax/ocal_storage/transformer 使用addax 启动时进行插件按需读取,发现读取到了插件,但是插件jar 内的其他clas 文件读取不到 报错如下

其中 插件时外置插件 我就写了个项目 并且打包出来放到了 上述的文件下 测试了Datax 下是可以正常执行的。
1704879462242

我测试了 插件的确被加载到了 只是在执行的时候出现了错误,我怀疑时插件与transformer 模块之前又引用冲突的问题 导致的

Version

4.1.3 (Default)

OS Type

Linux (Default)

Java JDK Version

Oracle JDK 1.8.0

Relevant log output

Exception in thread "taskGroup-0" com.wgzhao.addax.common.exception.AddaxException: java.lang.NoClassDefFoundError: com/wgzhao/addax/transformer/support/StringUtils
	at com.wgzhao.addax.transformer.StringTransformer.evaluate(StringTransformer.java:161)
	at com.wgzhao.addax.core.transport.exchanger.TransformerExchanger.doTransformer(TransformerExchanger.java:102)
	at com.wgzhao.addax.core.transport.exchanger.BufferedRecordTransformerExchanger.sendToWriter(BufferedRecordTransformerExchanger.java:108)
	at com.wgzhao.addax.rdbms.reader.CommonRdbmsReader$Task.transportOneRecord(CommonRdbmsReader.java:266)
	at com.wgzhao.addax.rdbms.reader.CommonRdbmsReader$Task.startRead(CommonRdbmsReader.java:236)
	at com.wgzhao.addax.plugin.reader.mysqlreader.MysqlReader$Task.startRead(MysqlReader.java:126)
	at com.wgzhao.addax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:82)
	at java.lang.Thread.run(Thread.java:750)
Caused by: java.lang.ClassNotFoundException: com.wgzhao.addax.transformer.support.StringUtils
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 8 more

	at com.wgzhao.addax.common.exception.AddaxException.asAddaxException(AddaxException.java:69)
	at com.wgzhao.addax.core.taskgroup.TaskGroupContainer.start(TaskGroupContainer.java:188)
	at com.wgzhao.addax.core.taskgroup.runner.TaskGroupContainerRunner.run(TaskGroupContainerRunner.java:44)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)
Caused by: java.lang.NoClassDefFoundError: com/wgzhao/addax/transformer/support/StringUtils
	at com.wgzhao.addax.transformer.StringTransformer.evaluate(StringTransformer.java:161)
	at com.wgzhao.addax.core.transport.exchanger.TransformerExchanger.doTransformer(TransformerExchanger.java:102)
	at com.wgzhao.addax.core.transport.exchanger.BufferedRecordTransformerExchanger.sendToWriter(BufferedRecordTransformerExchanger.java:108)
	at com.wgzhao.addax.rdbms.reader.CommonRdbmsReader$Task.transportOneRecord(CommonRdbmsReader.java:266)
	at com.wgzhao.addax.rdbms.reader.CommonRdbmsReader$Task.startRead(CommonRdbmsReader.java:236)
	at com.wgzhao.addax.plugin.reader.mysqlreader.MysqlReader$Task.startRead(MysqlReader.java:126)
	at com.wgzhao.addax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:82)
	... 1 more
Caused by: java.lang.ClassNotFoundException: com.wgzhao.addax.transformer.support.StringUtils
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 8 more

com.wgzhao.addax.transformer.support.StringUtils 这个类是不存在的,看下这个文件中 StringTransformer.java 是否依赖了 com.wgzhao.addax.transformer.support.StringUtils ,如果是,改成 依赖 org.apache.commons.lang3.StringUtils

com.wgzhao.addax.transformer.support.StringUtils 这个类是写在插件里面的 相当于我们在 mysqlreader 这个插件里面写的方法 ,不局限于这个方法,而是写的所有的类都无法读取,也就是说 addax 在进行数据转换的时候的确读取到了数据转换插件的jar 包,但是仅仅是StringTransformer 这一个类 其他的类都无法读取 就会报 NoClassDefFoundError 这个错误,这个问题已经困扰我2天了 一直没有解决 ,不知道是什么原因 ,是按需加载的时候没有加载进去还是 与transformer 模块发生了冲突

StringTransformer.java 是依赖了com.wgzhao.addax.transformer.support.StringUtils 这个文件
这两个文件的层级结构如下

 com.wgzhao.addax.transformer
----------|StringTransformer
----------|support
--------------|StringUtils 

有没有什么方法 可以查看jar 包中加载的类列表 或者我可以提供插件代码 给您 您那边测试一下这种方式

如果方便的话,可以把工程发给我,或者给我仓库地址,我可以在本次进行测试

https://gitee.com/quantongsui/yawei-addax-transformer.git 这是我建的仓库地址 你试一下能不能拉下代码来 打包后放到 addax-4.1.4-SNAPSHOT\local_storage\transformer 下

麻烦打包发邮件给我吧,gitee 下载代码还得注册登陆

好的,代码已经发送到您的gmail 邮箱

你的 yawei-addax-string/src/main/java/com/wgzhao/addax/transformer/support/StringUtils.java 文件是在 yawei-addax-string 模块里,但是你希望在 yawei-addax-information 模块里找到它。而且我看你虽然分了好几个模块,但是每个模块的类包(package) 名称都是一样的,这会导致引用混乱(考虑不同模块的类似目录下有相同文件名)。

所以一个建议的方案是在你的每个模块源代码里增加以及模块名的目录作为包名称,比如 yawei-addax-transformer 模块的代码层级可以这样

├── yawei-addax-information
│   ├── package.xml
│   ├── pom.xml
│   ├── src
│   │   └── main
│   │       ├── java
│   │       │   └── com
│   │       │       └── wgzhao
│   │       │           └── addax
│   │       │               └── transformer
│   │       │                   └── information
│   │       │                       ├── InformationTransformer.java
│   │       │                       └── support
│   │       │                           ├── CleanRuleConstant.java
│   │       │                           ├── DesensitizationUtils.java
│   │       │                           ├── EncryptUtils.java
│   │       │                           └── IDCardUtils.java

json 脚本已经发到您的邮箱了 您测试一下试试

json 脚本已经发到您的邮箱了 您测试一下试试

按照您的建议 修改了包名 但是问题还存在 貌似问题并不在这里

Exception in thread "taskGroup-0" com.wgzhao.addax.common.exception.AddaxException: java.lang.NoClassDefFoundError: com/wgzhao/addax/transformer/string/support/StringUtils
	at com.wgzhao.addax.transformer.string.StringTransformer.evaluate(StringTransformer.java:162)
	at com.wgzhao.addax.core.transport.exchanger.TransformerExchanger.doTransformer(TransformerExchanger.java:102)
	at com.wgzhao.addax.core.transport.exchanger.BufferedRecordTransformerExchanger.sendToWriter(BufferedRecordTransformerExchanger.java:108)
	at com.wgzhao.addax.rdbms.reader.CommonRdbmsReader$Task.transportOneRecord(CommonRdbmsReader.java:266)
	at com.wgzhao.addax.rdbms.reader.CommonRdbmsReader$Task.startRead(CommonRdbmsReader.java:236)
	at com.wgzhao.addax.plugin.reader.mysqlreader.MysqlReader$Task.startRead(MysqlReader.java:126)
	at com.wgzhao.addax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:82)
	at java.lang.Thread.run(Thread.java:750)
Caused by: java.lang.ClassNotFoundException: com.wgzhao.addax.transformer.string.support.StringUtils
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 8 more

	at com.wgzhao.addax.common.exception.AddaxException.asAddaxException(AddaxException.java:69)
	at com.wgzhao.addax.core.taskgroup.TaskGroupContainer.start(TaskGroupContainer.java:188)
	at com.wgzhao.addax.core.taskgroup.runner.TaskGroupContainerRunner.run(TaskGroupContainerRunner.java:44)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

你把项目根目录下的 pom.xml 文件中57行开始的以下依赖删除,然后再编译试试,我本地编译的jar文件已经包含了 om.wgzhao.addax.transformer.string.support.StringUtils

        <dependency>
            <groupId>com.wgzhao.addax</groupId>
            <artifactId>yawei-addax-string</artifactId>
            <version>${yawei.version}</version>
        </dependency>

        <dependency>
            <groupId>com.wgzhao.addax</groupId>
            <artifactId>yawei-addax-data</artifactId>
            <version>${yawei-version}</version>
        </dependency>
        <dependency>
            <groupId>com.wgzhao.addax</groupId>
            <artifactId>yawei-addax-information</artifactId>
            <version>${yawei-version}</version>
        </dependency>
        <dependency>
            <groupId>com.wgzhao.addax</groupId>
            <artifactId>yawei-addax-layout</artifactId>
            <version>${yawei-version}</version>
        </dependency>
        <dependency>
            <groupId>com.wgzhao.addax</groupId>
            <artifactId>yawei-addax-function</artifactId>
            <version>${yawei-version}</version>
        </dependency>

试过了 也是不行,感觉addax 只加载了StringTransformer 这一个类一样 其他的都没加载 很奇怪

开始加载StringUtils (这是StringTransformer 打印的log)
java.lang.NoClassDefFoundError: com/wgzhao/addax/transformer/string/support/StringUtils
	at com.wgzhao.addax.transformer.string.StringTransformer.evaluate(StringTransformer.java:164)
	at com.wgzhao.addax.core.transport.exchanger.TransformerExchanger.doTransformer(TransformerExchanger.java:102)
	at com.wgzhao.addax.core.transport.exchanger.BufferedRecordTransformerExchanger.sendToWriter(BufferedRecordTransformerExchanger.java:108)
	at com.wgzhao.addax.rdbms.reader.CommonRdbmsReader$Task.transportOneRecord(CommonRdbmsReader.java:266)
	at com.wgzhao.addax.rdbms.reader.CommonRdbmsReader$Task.startRead(CommonRdbmsReader.java:236)
	at com.wgzhao.addax.plugin.reader.mysqlreader.MysqlReader$Task.startRead(MysqlReader.java:126)
	at com.wgzhao.addax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:82)
	at java.lang.Thread.run(Thread.java:750)
Caused by: java.lang.ClassNotFoundException: com.wgzhao.addax.transformer.string.support.StringUtils
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 8 more`

你可以看下打包出来的jar文件里是否有 com/wgzhao/addax/transformer/string/support/StringUtils 这个类,如果没有那还是打包出现了问题了。我本地按照我说的方式打包后,是包含这个类的,因此测试可以通过。

这个问题 您有测试吗 能复现吗@wgzhao

我这边测试不会出现找不到类的情况,测试是正常的

您也是用这种 插件式的 数据转换器吗

我就是使用你的代码,修改了 pom 文件,然后按照你的安装方式进行测试了,数据转换是没有问题的。测试正常

能把你修改pom 后的文件打包发我邮箱一份吗

pom 文件pom.xml.zip 不是压缩的,直接去掉.zip 后缀就可以。

我这边编译好的文件你可以从 https://file.io/k399BKC5OyD6 这里下载,解压后测试看看