2021.9.28,内容:string

本文探讨了Java中String类型的不可变性,指出尽管String对象的内存地址不可变,但其内部的char数组可以通过反射进行修改。同时,对比了StringBuffer和StringBuilder,解释了它们的可变性以及在实际操作中的应用。通过深入理解这些概念,有助于优化Java程序的性能。
  1. String类型是final类型,在堆中分配空间后内存地址不可变。

  2. 底层是final修饰的char[]数组,数组的内存地址同样不可变。

但实际上可以通过修改char[n] = 'a’来进行修改,不会改变String实例的内存值,不过在jdk中,用户无法直接获取char[],也没有方法能操作该数组。

所以String类型的不可变实际上也是理论上的不可变。所以我们在分配String对象以后,如果将其 = “abc”,那也只是改变了引用的指向,实际上没有改变原来的对象。

  1. StringBuffer和StringBuilder底层是可变的char[]数组,继承父类AbstractStringBuilder的各种成员和方法,实际上的操作都是由父类方法来完成的。
maven项目依赖了nacos和区块链相关的jar包,启动后提示check invoke getVersion error one io.grpc.StatusRuntimeException: UNKNOWN, nacos配置是: <!-- SpringCloud Alibaba Nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.6.1</version> </dependency> <!-- SpringCloud Alibaba Nacos Config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.0.6.1</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2021.0.6.1</version> </dependency> 区块链配置是: <dependency> <groupId>org.chainmaker</groupId> <artifactId>chainmaker-sdk-java</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-openssl-static</artifactId> <scope>system</scope> <version>2.0.39.Final</version> <systemPath>${project.basedir}/lib/netty-tcnative-openssl-static-2.0.39.Final.jar</systemPath> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-handler</artifactId> <version>4.1.63.Final</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-api</artifactId> <version>1.42.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>1.42.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.42.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.42.0</version> </dependency>这是调整后的配置,启动后区块链初始化报错,2025-12-09 09:57:43.485 WARN  --- [ main] org.chainmaker.sdk.GrpcClientFactory  : check invoke getVersion error one java.util.concurrent.ExecutionException: io.grpc.StatusRuntimeException: UNKNOWN at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:566) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:445) at org.chainmaker.sdk.GrpcClientFactory.buseCheck(GrpcClientFactory.java:267) at org.chainmaker.sdk.GrpcClientFactory.createRpcClient(GrpcClientFactory.java:129) 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) 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: io.grpc.StatusRuntimeException: UNKNOWN at io.grpc.Status.asRuntimeException(Status.java:535) at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:534) at io.grpc.internal.DelayedClientCall$DelayedListener$3.run(DelayedClientCall.java:463) at io.grpc.internal.DelayedClientCall$DelayedListener.delayOrExecute(DelayedClientCall.java:427) at io.grpc.internal.DelayedClientCall$DelayedListener.onClose(DelayedClientCall.java:460) at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:562) at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:70) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:743) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:722) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133) 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.UnsupportedOperationException: null at io.grpc.netty.AbstractHttp2Headers.isEmpty(AbstractHttp2Headers.java:40) at io.netty.handler.codec.http2.DefaultHttp2ConnectionDecoder$FrameReadListener.onHeadersRead(DefaultHttp2ConnectionDecoder.java:419) at io.netty.handler.codec.http2.DefaultHttp2ConnectionDecoder$FrameReadListener.onHeadersRead(DefaultHttp2ConnectionDecoder.java:352) at io.netty.handler.codec.http2.Http2InboundFrameLogger$1.onHeadersRead(Http2InboundFrameLogger.java:56) at io.netty.handler.codec.http2.DefaultHttp2FrameReader$2.processFragment(DefaultHttp2FrameReader.java:476) at io.netty.handler.codec.http2.DefaultHttp2FrameReader.readHeadersFrame(DefaultHttp2FrameReader.java:484) at io.netty.handler.codec.http2.DefaultHttp2FrameReader.processPayloadState(DefaultHttp2FrameReader.java:253) at io.netty.handler.codec.http2.DefaultHttp2FrameReader.readFrame(DefaultHttp2FrameReader.java:159) at io.netty.handler.codec.http2.Http2InboundFrameLogger.readFrame(Http2InboundFrameLogger.java:41) at io.netty.handler.codec.http2.DefaultHttp2ConnectionDecoder.decodeFrame(DefaultHttp2ConnectionDecoder.java:188) at io.netty.handler.codec.http2.Http2ConnectionHandler$FrameDecoder.decode(Http2ConnectionHandler.java:393) at io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:453) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1504) at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1253) at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1300) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ... 1 common frames omitted
最新发布
12-10
<think>根据用户的问题,用户在使用Maven项目依赖SpringCloud Alibaba Nacos和链盟科技Java SDK以及其他gRPC组件时,启动后出现两个错误: 1. &#39;check invoke getVersion error one&#39; 2. &#39;java.lang.UnsupportedOperationException&#39; 由于用户没有提供具体的版本号,我将基于常见的版本冲突和兼容性问题进行分析。通常,这类问题可能由以下原因引起: 1. 版本不兼容:SpringCloud Alibaba、Nacos、链盟SDK、gRPC等组件版本之间存在兼容性问题。 2. 依赖冲突:多个依赖引入了相同库的不同版本,导致运行时使用了不兼容的版本。 3. 配置错误:Nacos相关配置不正确,如临时实例设置、TLS配置等。 4. SDK使用问题:链盟科技Java SDK可能需要特定的初始化或配置。 根据引用[3]和[4],我们注意到Nacos的配置可能涉及TLS设置和临时实例设置,但这些可能不是直接原因。不过,我们可以从这些配置中获取一些线索。 **解决思路:** 1. **检查版本兼容性**:首先确认SpringCloud Alibaba、Nacos Client、链盟SDK以及gRPC的版本是否兼容。特别是SpringCloud Alibaba的版本与SpringBoot版本的对应关系,以及链盟SDK所依赖的gRPC版本是否与项目中其他gRPC依赖一致。 2. **排除依赖冲突**:使用Maven的依赖树分析工具,检查是否存在多个版本的相同库,特别是gRPC和Nacos相关库。 3. **检查链盟SDK的兼容性**:链盟SDK可能依赖于特定版本的gRPC,如果项目中引入了其他版本的gRPC,可能导致`UnsupportedOperationException`。 4. **查看错误日志**:详细分析错误堆栈,确定错误发生的具体位置,以便定位是哪个组件的问题。 **具体步骤:** ### 步骤1: 确认版本兼容性 请确保使用的SpringCloud Alibaba版本与SpringBoot版本兼容。参考官方文档: - [SpringCloud Alibaba版本说明](https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E) 例如,SpringCloud Alibaba 2.2.7.RELEASE对应SpringBoot 2.3.x,而Nacos Client版本通常与SpringCloud Alibaba保持一致。 同时,检查链盟科技Java SDK的文档,确认其支持的SpringBoot版本和gRPC版本。 ### 步骤2: 排除依赖冲突 在项目根目录下执行: ```bash mvn dependency:tree -Dverbose ``` 查看输出中gRPC、Nacos Client以及链盟SDK相关依赖的版本。重点检查是否有多个版本的gRPC库(如grpc-netty, grpc-protobuf, grpc-stub等)。 如果存在版本冲突,可以在pom.xml中排除不需要的版本。例如: ```xml <dependency> <groupId>com.xxx</groupId> <artifactId>blockchain-sdk</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> </exclusion> </exclusions> </dependency> ``` ### 步骤3: 检查gRPC版本 `java.lang.UnsupportedOperationException`可能是由于gRPC版本不匹配导致的。例如,链盟SDK可能使用了较新的gRPC API,而项目中引入的是旧版本,或者反之。 确保所有gRPC相关组件的版本一致。例如,统一使用1.30.0版本(具体版本需根据SDK要求): ```xml <properties> <grpc.version>1.30.0</grpc.version> </properties> <dependencies> <!-- 其他依赖 --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> </dependencies> ``` ### 步骤4: 检查Nacos配置 根据引用[3],Nacos的TLS配置可以通过JVM参数设置。尝试在启动时添加以下参数,看是否解决第一个错误: ``` -Dcom.alibaba.nacos.client.naming.tls.enable=true ``` 或者 ``` -Dcom.alibaba.nacos.client.naming.tls.enable=false ``` 另外,引用[4]提到临时实例的配置,但此问题可能不直接相关,不过也可以检查: ```yaml spring: cloud: nacos: discovery: ephemeral: true # 或false,根据需求 ``` ### 步骤5: 查看链盟SDK的初始化 检查链盟SDK的初始化代码,确保按照其文档正确初始化。特别是版本检查(可能对应`check invoke getVersion error one`)可能需要特定的环境或配置。 ### 步骤6: 查看完整错误堆栈 提供完整的错误堆栈(特别是`Caused by`部分)有助于进一步定位问题。例如,`UnsupportedOperationException`可能是由于某个类的方法不被实现,这通常发生在接口的默认方法未被重写,或者使用了不兼容的库版本。 **总结建议:** 1. 统一gRPC版本,排除冲突。 2. 尝试调整Nacos的TLS配置。 3. 确保所有组件版本兼容。 如果问题仍然存在,请提供具体的版本信息和完整的错误堆栈。 §§相关问题§§ 1. 如何解决Maven依赖冲突? 2. SpringCloud Alibaba版本与SpringBoot版本如何对应? 3. 如何配置Nacos的TLS安全连接? 4. 在SpringBoot中如何统一管理gRPC版本? </think> ### 解决Maven项目依赖Nacos和区块链SDK启动报错方案 #### 错误原因分析 1. **版本冲突** `java.lang.UnsupportedOperationException` 通常由以下原因引起: - gRPC版本与其他依赖不兼容(特别是链盟SDK可能依赖特定gRPC版本) - SpringCloud Alibaba组件与gRPC存在隐式版本冲突 - Nacos客户端与区块链SDK的依赖树存在冲突 2. **初始化顺序问题** `check invoke getVersion error one` 表明区块链SDK初始化时版本检查失败,可能因: - gRPC通道未正确建立 - 依赖组件未完全加载时SDK已初始化 #### 解决方案(逐步操作) ##### 步骤1:统一gRPC版本(关键) 在`pom.xml`中添加版本锁定(示例使用gRPC 1.42.1,请替换为您的指定版本): ```xml <properties> <grpc.version>1.42.1</grpc.version> <!-- 替换为实际版本 --> </properties> <dependencyManagement> <dependencies> <!-- 统一gRPC组件版本 --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> <!-- 强制指定Nacos版本 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.4.0</version> <!-- 替换为您的版本 --> </dependency> </dependencies> </dependencyManagement> ``` ##### 步骤2:排除冲突依赖 在区块链SDK依赖中添加排除项: ```xml <dependency> <groupId>com.liameng</groupId> <artifactId>blockchain-sdk</artifactId> <version>[您的SDK版本]</version> <exclusions> <!-- 排除可能冲突的gRPC模块 --> <exclusion> <groupId>io.grpc</groupId> <artifactId>*</artifactId> </exclusion> <!-- 排除旧版protobuf --> <exclusion> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> </exclusion> </exclusions> </dependency> ``` ##### 步骤3:添加Nacos TLS配置 在`application.yml`中显式关闭TLS(解决部分版本兼容问题): ```yaml spring: cloud: nacos: discovery: # 关闭TLS防止连接异常 secure: false # 显式设置临时实例模式 ephemeral: true config: # 添加Nacos服务器地址 server-addr: 127.0.0.1:8848 ``` ##### 步骤4:初始化顺序控制 在Spring启动类添加初始化逻辑: ```java @SpringBootApplication public class Application { public static void main(String[] args) { // 先初始化gRPC环境 GrpcUtils.ensureGrpcLoaded(); // 再启动Spring容器 SpringApplication.run(Application.class, args); } static class GrpcUtils { static void ensureGrpcLoaded() { try { // 强制加载gRPC核心类 Class.forName("io.grpc.netty.NettyChannelBuilder"); } catch (ClassNotFoundException e) { throw new RuntimeException("gRPC初始化失败", e); } } } } ``` #### 验证方案 1. 检查依赖树确认版本统一: ```bash mvn dependency:tree -Dincludes=io.grpc,com.alibaba.nacos ``` 2. 在SDK初始化前添加日志验证加载顺序: ```java @Bean public BlockchainService blockchainService() { log.info("初始化区块链SDK..."); // 初始化代码 } ``` #### 典型错误场景示例 若使用gRPC 1.40+ 与 Netty 4.1.76+ 组合时,需额外添加: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.46.Final</version> <!-- 解决SSL相关UnsupportedOperationException --> </dependency> ``` > **重要提示**:若问题仍未解决,请提供: > 1. 完整的异常堆栈信息 > 2. `mvn dependency:tree` 输出 > 3. 区块链SDK的初始化代码片段
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值