Java代码不执行也不报错(Maven项目)

厂商反馈Java中间件客户端在执行时不报错也不继续,问题定位到Zookeeper连接。通过检查发现并非Zookeeper连接问题,而是`countDownLatch.await()`可能导致的无限等待。进一步分析怀疑是Maven缓存问题,执行`mvn clean`清理缓存后再`mvn package`打包,问题得到解决,强调了遇到奇怪问题时清理缓存的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        背景:厂商反馈说中间件的客户端在被调用过程中不报错也不继续往下执行。

        代码:分析得出的问题代码如下,在新建SDKClient实例时,将调用第二段代码构造器,但发现第二段代码中连第一个System.out.println都不打印。

SDKClient client = new SDKClient();
	public SDKClient() {
		System.out.println("before---LoadBalancer.getSingleInstance()");
		balancer = LoadBalancer.getSingleInstance();
		System.out.println("after---LoadBalancer.getSingleInstance()");
		this.sdkHandler = new SDKClientHandler();
		System.out.println("before---new FileCache()");
		this.fileCache = new FileCache();
		System.out.println("after---new FileCache()");
		sdkHandler.setFileCache(fileCache);
	}

        分析过程:刚开始以为是客户端获取Zookeeper连接造成的,但是在服务端看zookeeper.out发现连接根本没有到服务端,让厂商在他们项目所在的机器上执行命令:wget [Zookeeper服务端主机号:Zookeeper服务端端口号]      发现连接能成功到Zookeeper服务端。   另:发现了隐藏的bug==》countDownLatch.await(),当Zookeeper客户端连不上服务端时,将造成无限等待,修改方向==》countDownLatch.await(30, TimeUnit.SECONDS);

public class AbstractZooKeeper implements Watcher {
	private static final int SESSION_TIME = 31000;
	protected ZooKeeper zooKeeper;
	protected CountDownLatch countDownLatch;
	
	public void connect(String host) {
		
		try {
			countDownLatch = new CountDownLatch(1);
			zooKeeper = new ZooKeeper(host,SESSION_TIME,this);
			countDownLatch.await();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void process(WatchedEvent event) {
		if (event.getState() == KeeperState.SyncConnected) {
			countDownLatch.countDown();
		} 
	}
	
	public void close() {
		try {
			zooKeeper.close();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

        最终分析排查:自行打了个jar包到厂商服务器上运行,发现能成功脸上Zookeeper并获得数据。怀疑过类加载器的问题,但仔细想想不太可能,因为如果类加载器有问题,那么在程序启动时就应该报错了。观察厂商打包的方式发现是用mvn package 命令(本人此时20180717对maven不熟,没有在现场察觉到这可能是个问题),在网上查阅资料发现mvn package 是以缓存方式生成class到target然后打包,并在某篇文章上看到某同行也因为ROOT下缓存造成程序卡住不执行也不报错。虽然不太一样,但感觉mvn缓存很可能就是造成程序不报错也不往下执行的原因,遂让厂商执行下mvn clean再执行mvn package,最终,这个问题解决了...... 果然,“遇到问题先杀缓存”是有道理的

 

        启发:当某个错误很离奇时,往往是某个细节造成的

### 解决Maven项目依赖树无误但代码报错的方法 当遇到Maven项目的依赖树没有任何错误,但是代码仍然存在编译或其他类型的错误时,可以采取一系列措施来排查并解决问题。 #### 1. 清理和重新构建项目 执行清理命令能够移除之前可能存在的一致文件或缓存数据。通过运行`mvn clean package`,仅可以清除旧的目标目录中的类文件和其他资源,还可以触发完整的打包过程[^1]: ```bash mvn clean package ``` 这一步骤有助于确保所有的源码都被最新版本的库所编译,并且任何潜在的冲突都得到解决。 #### 2. 检查POM配置的一致性 如果项目由多个模块组成,则需确认各个子模块下的`pom.xml`文件是否正确设置了父级关系。对于多模块结构来说,在每一个必要的地方加入如下所示的内容是非常重要的[^2]: ```xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.mycompany.app</groupId> <artifactId>app</artifactId> <version>1.0-SNAPSHOT</version> </parent> ... </project> ``` 这样做能保证所有子模块都能继承来自根级别的设置以及共享相同的属性定义。 #### 3. 更新IDE索引与刷新工程视图 有时开发环境内部的状态可能会滞后于实际磁盘上的更改;因此建议更新集成开发环境中关于该项目的信息。具体操作取决于使用的工具——例如Eclipse中可以选择“Project -> Clean...”,而在IntelliJ IDEA里则是点击右上角的小象图标选择“Invalidate Caches / Restart”。 #### 4. 审核日志输出寻找线索 仔细查看控制台打印出来的警告信息或是异常堆栈跟踪记录,这些往往包含了指向根本原因的关键提示。特别注意那些涉及找到特定方法签名、无法解析符号等问题的地方。 #### 5. 验证Java版本兼容性和编码标准遵循情况 确保整个应用程序及其依赖项都是基于相同的主要次级版本号构建而成,并且遵守统一的编程风格指南。同版本之间可能存在API差异或者行为变化,而违反既定规范也可能引发意想到的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值