java.lang.UnsatisfiedLinkError: Native method not found解决方案

本文介绍了在使用JNI时遇到java.lang.UnsatisfiedLinkError: Nativemethodnotfound问题的原因及解决方案,包括方法签名大小写错误、C++文件处理不当以及传递空值等问题。

今天用文档阅读器打开pdf文件时候,出现Application Error错误,

用IDE调试时候发现抛了异常:java.lang.UnsatisfiedLinkError: Native method not found。查到以下解决方案:


so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素:

一、Jni方法头部大小写问题     

在C++中,方法名:Java_com_XXX,而不是java_com_XXX。建议直接从生成的.h头文件直接复制方法名到C或者C++文件中。

二、C++文件问题

        如果是C++文件(.cpp或者.cc),要使用extern "C" {   } 把本地方法括进去。

三、往Jni方法中传值问题

         如,调用native方法sendSomeThing(Object object),如果传入的object为null,有可能会报上面错误。


最后发现是调用JNI时参数传了null值。

引入netty-tcnative-boringssl-static包后报错Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) 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:65) Caused by: java.lang.UnsatisfiedLinkError: failed to load the required native library at io.netty.handler.ssl.OpenSsl.ensureAvailability(OpenSsl.java:616) at io.netty.handler.ssl.SslContext.newClientContextInternal(SslContext.java:835) at io.netty.handler.ssl.SslContextBuilder.build(SslContextBuilder.java:615) at org.chainmaker.sdk.RpcServiceClient.initManagedChannel(RpcServiceClient.java:160) at org.chainmaker.sdk.RpcServiceClient.<init>(RpcServiceClient.java:83) at org.chainmaker.sdk.RpcServiceClient.newServiceClient(RpcServiceClient.java:91) at org.chainmaker.sdk.GrpcClientFactory.createRpcClient(GrpcClientFactory.java:126) at org.chainmaker.sdk.GrpcClientFactory.create(GrpcClientFactory.java:109) at org.chainmaker.sdk.GrpcClientFactory.create(GrpcClientFactory.java:21) at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:70) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:571) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:298) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:223) at org.chainmaker.sdk.ChainClient.sendTxRequest(ChainClient.java:2778) at org.chainmaker.sdk.ChainClient.sendRequest(ChainClient.java:3201) at org.chainmaker.sdk.ChainClient.proposalRequest(ChainClient.java:3107) at org.chainmaker.sdk.ChainClient.getChainConfig(ChainClient.java:1103) at com.carbonfootprint.common.maker.configure.ChainConfig.getChainConfig(ChainConfig.java:11) at com.carbonfootprint.portalmgmt.CarbonFootprintPortalMgmtApplication.main(CarbonFootprintPortalMgmtApplication.java:32) ... 8 more Caused by: java.lang.IllegalArgumentException: Failed to load any of the given libraries: [netty_tcnative_linux_x86_64, netty_tcnative_linux_x86_64_fedora, netty_tcnative_x86_64, netty_tcnative] at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:114) at io.netty.handler.ssl.OpenSsl.loadTcNative(OpenSsl.java:725) at io.netty.handler.ssl.OpenSsl.<clinit>(OpenSsl.java:151) at io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:169) at org.chainmaker.sdk.RpcServiceClient.getSslContextBuilder(RpcServiceClient.java:204) at org.chainmaker.sdk.RpcServiceClient.initManagedChannel(RpcServiceClient.java:147) ... 23 more Suppressed: java.lang.IllegalStateException: Multiple resources found for 'META-INF/native/libnetty_tcnative_linux_x86_64.so' with different content: [jar:file:/app/run.jar!/BOOT-INF/lib/netty-tcnative-openssl-static-2.0.39.Final.jar!/META-INF/native/libnetty_tcnative_linux_x86_64.so, jar:file:/app/run.jar!/BOOT-INF/lib/netty-tcnative-boringssl-static-2.0.61.Final-linux-x86_64.jar!/META-INF/native/libnetty_tcnative_linux_x86_64.so] at io.netty.util.internal.NativeLibraryLoader.getResource(NativeLibraryLoader.java:301) at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:173) at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105) ... 28 more Suppressed: java.lang.UnsatisfiedLinkError: could not load a native library: netty_tcnative_linux_x86_64_fedora at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:239) at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105) ... 28 more Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_tcnative_linux_x86_64_fedora.so at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:186) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative_linux_x86_64_fedora in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:396) at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:161) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative_linux_x86_64_fedora in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:430) at java.security.AccessController.doPrivileged(Native Method) at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:422) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:388) ... 30 more Suppressed: java.lang.UnsatisfiedLinkError: could not load a native library: netty_tcnative_x86_64 at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:239) at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105) ... 28 more Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_tcnative_x86_64.so at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:186) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative_x86_64 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:396) at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:161) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative_x86_64 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:430) at java.security.AccessController.doPrivileged(Native Method) at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:422) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:388) ... 30 more Suppressed: java.lang.UnsatisfiedLinkError: could not load a native library: netty_tcnative at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:239) at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105) ... 28 more Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_tcnative.so at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:186) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:396) at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:161) ... 29 more Suppressed: java.lang.UnsatisfiedLinkError: no netty_tcnative in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:871) at java.lang.System.loadLibrary(System.java:1124) at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:430) at java.security.AccessController.doPrivileged(Native Method) at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:422) at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:388) ... 30 more
最新发布
12-10
<think>我们遇到了两个主要问题: 1. `java.lang.UnsatisfiedLinkError: failed to load the required native library` - 这通常是因为无法加载本地库(如dll或so文件)导致的。 2. `Multiple resources found` - 资源文件冲突,可能是由于多个依赖包含相同路径的资源文件。 根据之前的讨论,我们已经引入了`netty-tcnative-boringssl-static`包,但出现了上述问题。以下将分别解决这两个问题。 首先,我们分析`UnsatisifiedLinkError`。这个错误通常发生在JVM尝试加载本地库(通过`System.loadLibrary`或`System.load`)时找不到对应的本地库。`netty-tcnative-boringssl-static`是一个包含多个平台本地库的jar包(如Windows、Linux等),它会在运行时根据当前操作系统解压对应的本地库并加载。出现该错误的原因可能有: - 该jar包没有正确下载或包含在classpath中。 - 当前操作系统平台不在其支持的范围内(比如一些罕见的平台)。 - 依赖冲突导致多个版本的`netty-tcnative`存在,而加载了错误的版本。 其次,`Multiple resources found`错误通常是因为在多个jar包中发现了相同路径的资源文件。例如,可能有多个jar包都包含了`META-INF/NOTICE`等文件。 解决方案如下: ### 一、解决`UnsatisifiedLinkError` 1. **确认依赖是否正确引入**:检查`netty-tcnative-boringssl-static`是否已经正确添加到项目中。在Maven中,我们可以使用以下命令检查依赖树: ```bash mvn dependency:tree -Dincludes=io.netty:netty-tcnative-* ``` 确保输出中包含类似如下内容: ``` [INFO] +- io.netty:netty-tcnative-boringssl-static:jar:2.0.61.Final:compile ``` 2. **统一版本**:确保项目中所有`netty-tcnative`相关的依赖都是同一个版本。如果有多个版本,可以在`<dependencyManagement>`中统一指定版本: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.61.Final</version> </dependency> </dependencies> </dependencyManagement> ``` 3. **检查操作系统支持**:`netty-tcnative-boringssl-static`默认支持常见的操作系统(Windows、Linux、MacOS)和架构(x86_64, aarch64等)。如果您的操作系统或架构比较特殊,可能需要使用其他分类器(classifier)的版本。例如,对于Linux的aarch64架构,可以这样引入: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.61.Final</version> <classifier>linux-aarch_64</classifier> </dependency> ``` 但通常使用不带分类器的jar即可,因为它是一个uber jar,包含了多个平台的库,并且会自动选择正确的平台。 4. **确保没有其他依赖覆盖**:检查是否有其他依赖排除了`netty-tcnative`,或者在运行时被其他版本覆盖。 5. **运行时环境问题**:在某些环境中(如某些Docker镜像),可能缺少必要的库(如glibc等),导致无法加载。请确保运行环境满足要求。 6. **手动加载调试**:为了进一步诊断,可以在代码中尝试手动加载本地库: ```java public class NativeLibraryLoader { static { try { // 尝试加载netty-tcnative的本地库 System.loadLibrary("netty_tcnative"); } catch (UnsatisfiedLinkError e) { e.printStackTrace(); // 打印更详细的信息 System.err.println("Failed to load netty_tcnative: " + e.getMessage()); // 可以尝试指定文件路径加载 // System.load("/path/to/libnetty_tcnative.so"); } } } ``` 如果手动加载失败,可以查看详细的错误信息。 ### 二、解决`Multiple resources found`问题 这个错误通常发生在资源文件合并时,多个jar包中包含相同路径的资源文件。例如,多个jar包中可能都包含`META-INF/LICENSE`或`META-INF/NOTICE`等文件。 在Maven构建中,可以使用`maven-shade-plugin`来处理资源文件冲突,具体如下: 1. **配置`maven-shade-plugin`**:在`pom.xml`中配置该插件,设置资源合并策略(如使用`AppendingTransformer`合并某些文件,使用`ServicesResourceTransformer`合并服务配置文件等): ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并META-INF/services下的文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 合并特定资源文件,例如NOTICE和LICENSE --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/NOTICE</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/LICENSE</resource> </transformer> <!-- 合并Spring的spring.handlers和spring.schemas --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 这样配置后,在打uber jar时,相同路径的资源文件会被合并而不是覆盖。 2. **排除不必要的资源**:如果有些资源文件不需要,可以在依赖中排除: ```xml <dependency> <groupId>some.group</groupId> <artifactId>some-artifact</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>...</groupId> <artifactId>...</artifactId> </exclusion> </exclusions> </dependency> ``` 或者在`maven-shade-plugin`中过滤掉: ```xml <configuration> <filters> <filter> <artifact>some.group:some-artifact</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> ... </configuration> ``` ### 三、综合建议 1. **更新依赖版本**:检查是否有更新的`netty-tcnative-boringssl-static`版本,以及区块链SDK是否支持更高版本的Netty。有时新版本可能已经解决了已知问题。 2. **检查依赖冲突**:使用`mvn dependency:tree`查看整个依赖树,检查是否有其他依赖引入了不同版本的Netty或`netty-tcnative`,如果有,则进行排除或统一版本。 3. **参考官方文档**:区块链SDK(如chainmaker-sdk-java)的官方文档可能会说明其依赖的Netty版本以及`netty-tcnative`的使用方式。 4. **使用`jvmarg`指定库路径**:如果问题仍然存在,可以尝试在启动JVM时指定本地库路径,例如: ```bash java -Djava.library.path=/path/to/native/libs -jar your-application.jar ``` 其中`/path/to/native/libs`目录下包含所需的本地库文件(如libnetty_tcnative.so等)。 5. **使用`tcnative`的动态加载版本**:如果静态版本(static)有问题,可以尝试使用动态版本(如`netty-tcnative`),但需要确保目标系统上有安装OpenSSL等依赖。 6. **日志调试**:增加Netty的日志级别,以便获取更多信息: ```bash java -Dio.netty.leakDetection.level=advanced -Dio.netty.handler.ssl.noOpenSsl=true/false ... ``` 注意:设置`-Dio.netty.handler.ssl.noOpenSsl=true`可以强制使用JDK的SSL实现,但这可能会影响性能,并且可能不符合区块链SDK的要求。 7. **查看BoringSSL的加载日志**:Netty在加载BoringSSL时会有日志输出,可以通过设置日志级别来查看: ```java // 在代码中设置 System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug"); ``` 8. **检查防火墙或代理设置**:如果从远程仓库下载依赖时遇到问题(如引用[1]中的情况),可能需要设置Git的镜像或代理。但这里主要针对的是构建时依赖下载,如果构建成功则不需要考虑。 9. **SSL协议版本问题**:引用[3][4][5]提到的SSL错误(`WRONG_VERSION_NUMBER`)可能是由于客户端和服务端使用的SSL/TLS版本不匹配。但我们的问题是在加载本地库时出现的,因此可能不直接相关。不过,如果本地库加载成功后仍然出现SSL连接问题,可以考虑调整SSL协议版本。 ### 四、案例参考 假设我们遇到的是在Windows x64环境下运行,我们可以这样配置依赖: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.61.Final</version> <!-- 如果需要,可以指定分类器,但通常不需要 --> <!-- <classifier>windows-x86_64</classifier> --> </dependency> ``` 然后在代码中初始化时,可以打印出Netty的版本和可用的OpenSSL版本: ```java import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.SslProvider; public class SSLTest { public static void main(String[] args) throws Exception { System.out.println("Netty version: " + io.netty.util.Version.identify().get("netty-common")); if (OpenSsl.isAvailable()) { System.out.println("OpenSSL is available, version: " + OpenSsl.versionString()); } else { System.out.println("OpenSSL not available: " + OpenSsl.unavailabilityCause()); } } } ``` 运行这个测试可以验证Netty是否成功加载了OpenSSL。 最后,请根据上述步骤逐一排查。如果问题仍然存在,请提供详细的错误堆栈和运行环境信息(操作系统、JDK版本等)以便进一步分析。 --- §§相关问题§§ 1. 如何解决`java.lang.UnsatisfiedLinkError`错误? 2. Maven中如何处理多个jar包资源文件冲突? 3. 如何检查Java程序中的本地库加载路径? 4. 如何在运行时调试Netty的SSL配置? 5. 如何指定JVM加载本地库的路径? 6. `netty-tcnative`的静态版本和动态版本有何区别,如何选择? </think> ### 解决方案:解决`UnsatisfiedLinkError`和资源冲突问题 #### 1. **解决`UnsatisfiedLinkError`(本地库加载失败)** 根本原因是JVM无法加载`netty-tcnative`的本地库文件(.dll/.so),常见于以下情况: --- ##### 1.1 确保包含正确的平台依赖 在`pom.xml`中添加完整的平台分类器依赖: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.61.Final</version> <!-- 根据操作系统选择分类器 --> <classifier>${os.detected.classifier}</classifier> </dependency> ``` 添加操作系统检测插件: ```xml <build> <plugins> <plugin> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.7.1</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>detect</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` --- ##### 1.2 验证本地库加载 在代码中添加验证逻辑: ```java import io.netty.internal.tcnative.Library; public class NativeLibLoader { static { try { // 手动初始化BoringSSL Library.initialize("provided"); System.out.println("BoringSSL loaded successfully"); } catch (Throwable t) { t.printStackTrace(); System.err.println("BoringSSL加载失败: " + t.getMessage()); } } } ``` --- ##### 1.3 运行时指定库路径 启动时添加JVM参数: ```bash java -Djava.library.path=./lib -jar your-app.jar ``` 确保包含`netty-tcnative`库文件的目录在路径中 --- #### 2. **解决多重资源冲突** 使用Maven Shade插件合并资源: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并所有META-INF/services资源 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 合并NOTICE和LICENSE文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/NOTICE</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/LICENSE</resource> </transformer> <!-- 处理Spring配置文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin> ``` --- #### 3. **完整依赖优化配置** ```xml <dependencies> <!-- 区块链SDK(排除冲突依赖) --> <dependency> <groupId>org.chainmaker</groupId> <artifactId>chainmaker-sdk-java</artifactId> <version>2.3.2</version> <exclusions> <exclusion> <groupId>io.netty</groupId> <artifactId>*</artifactId> </exclusion> <exclusion> <groupId>io.grpc</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 统一Netty依赖 --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.86.Final</version> </dependency> <!-- BoringSSL静态库(自动选择平台) --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.61.Final</version> <classifier>${os.detected.classifier}</classifier> </dependency> </dependencies> ``` --- #### 4. **SSL协议版本兼容性处理** 在应用启动时添加JVM参数(解决引用[3][4][5]的SSL错误): ```bash # 强制使用TLSv1.2协议 -Djdk.tls.client.protocols=TLSv1.2 ``` 或在代码中配置: ```java System.setProperty("jdk.tls.client.protocols", "TLSv1.2"); ``` --- ### 验证步骤 1. **依赖检查**: ```bash mvn dependency:tree | grep -E '(netty|tcnative)' ``` 确认无重复依赖 2. **运行时验证**: ```java public static void main(String[] args) { System.out.println("OpenSSL可用: " + OpenSsl.isAvailable()); System.out.println("协议支持: " + Arrays.toString(SSLContext.getDefault().getSupportedSSLParameters().getProtocols())); } ``` 3. **资源冲突检查**: 解压生成的JAR文件,检查`META-INF`目录: ```bash jar tf target/your-app.jar | grep META-INF ``` --- ### 常见问题排查 1. **Windows环境注意**: - 确保VC++运行库已安装 - 检查防软件是否拦截了DLL加载 2. **Linux环境注意**: ```bash # 安装基础依赖 sudo apt install libapr1-dev libssl-dev ``` 3. **Docker部署**: 在Dockerfile中添加: ```dockerfile FROM openjdk:11-jre-slim RUN apt update && apt install -y libapr1 openssl ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值