IVY throws IOException Resetting to invalid mark原因及解决办法

本文介绍了当Ivy配置文件过大导致无法解析依赖的问题及解决方案。通过将单一的ivy.xml文件拆分成多个小文件,并调整Ant构建脚本来分别处理这些小文件,解决了因文件过大而引发的错误。

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

        当Ivy文件大于10K后,执行jar包加载后会报如下错:impossible to resolve dependencies: java.io.IOException: Resetting to invalid mark。

        删除一些注释后,文件小于10K,下载又正常了。

        查找了官方网站说明,确认是一个BUG:https://issues.apache.org/jira/browse/IVY-1289。但后来一想,如果不升级版本,随着依赖的第三方JAR包增多怎么办呢?

        于是想到了将ivy.xml拆成多个文件并修改ant脚本如下,经验证OK。

<!-- 下载或从本地缓存获取第三方包 -->
<target name="get-lib" depends="init,clean-lib-cache,configure-lib" description="下载或从本地缓存获取第三方包">
	<ivy:resolve file="ivy.xml" conf="*" />
	<ivy:retrieve pattern="${build.lib.dir}/[artifact].[ext]" />
	<copy todir="${build.lib.dir}">
		<fileset dir="${ext.lib}">
		</fileset>
	</copy>
</target>

        修改为:

<!-- 下载或从本地缓存获取第三方包 -->
<target name="get-lib" depends="init,clean-lib-cache,configure-lib" description="下载或从本地缓存获取第三方包">
	<ivy:resolve file="ivy-01.xml" conf="*" />
	<ivy:retrieve pattern="${build.lib.dir}/[artifact].[ext]" />
	<echo>********************************</echo>
	<ivy:resolve file="ivy-02.xml" conf="*" />
	<ivy:retrieve pattern="${build.lib.dir}/[artifact].[ext]" />
	<copy todir="${build.lib.dir}">
		<fileset dir="${ext.lib}">
		</fileset>
	</copy>
</target>

        当然,除了这种方式,还可以将get-lib命令拆成两个命令,原get-lib命令依赖拆分后的这两个命令。如下所示:

<!-- =================================================================== -->
<!-- 下载或从本地缓存获取第三方包 -->
<!-- =================================================================== -->
<target name="get-lib" depends="get-lib1,get-lib2"/> 
          
<target name="get-lib1" depends="init,clean-lib-cache,configure-lib" description="下载或从本地缓存获取第三方包">
    <ivy:retrieve pattern="${build.lib.dir}/[artifact].[ext]" />
</target>
    
<target name="get-lib2" description="下载或从本地缓存获取第三方包">
    <ivy:resolve file ="ivy2.xml"  />  
    <ivy:retrieve pattern="${build.lib.dir}/[artifact].[ext]" />
</target>

 

Ivy与Ant集成学习资料:http://blog.youkuaiyun.com/lisonghua/article/details/4770260

### Java 中 `throws IOException` 的用法及处理方式 #### 一、`throws IOException` 的含义 在 Java 方法声明中,关键字 `throws` 后面跟随的是可能由该方法抛出的异常类型列表。具体来说,`throws IOException` 表示当前方法可能会抛出 `IOException` 类型的异常[^1]。这意味着调用方需要对此异常进行显式的捕获或者继续向上层传递。 当方法内部存在可能导致 I/O 错误的操作(例如文件读写),开发者可以通过 `throws IOException` 声明来表明这些潜在风险的存在。这样做的目的是遵循 Java 的受检异常机制,强制调用者考虑并妥善处理可能出现的错误情况[^2]。 #### 二、如何使用 `throws IOException` 以下是几种常见的场景及其对应的代码实现: 1. **直接声明抛出异常** 如果某个方法无法自行处理某些类型的异常,则可以选择将其交给上级调用者负责。 ```java public void readFileContent(String filePath) throws IOException { File file = new File(filePath); FileInputStream fis = new FileInputStream(file); int data; while ((data = fis.read()) != -1) { System.out.print((char) data); } fis.close(); } ``` 上述例子展示了通过 `FileInputStream` 进行基本文件操作时遇到问题会触发 `IOException`,而我们并未在此处做任何额外防护措施而是单纯依赖外部逻辑完成修复工作[^3]。 2. **结合 try-catch 结构局部化解决方案** 当然也可以选择立即应对可能发生的情况,在本地范围内采取行动而不是让整个应用崩溃退出运行状态之外的状态外溢出去影响其他部分正常运转下去的可能性变得很小了。 ```java public String processFile(String path){ StringBuilder contentBuilder=new StringBuilder(); try(FileInputStream input=new FileInputStream(path)){ int character; while((character=input.read())!=-1){ contentBuilder.append((char)character); } }catch(IOException ex){//Handle exception here. return "Error occurred during reading:"+ex.getMessage(); } return contentBuilder.toString(); } ``` 此版本利用了资源管理器特性简化关闭流的过程,并且提供了友好的反馈信息给最终用户查看以便于他们了解到底发生了什么事情以及下一步该如何去做才能恢复正常服务级别之上再次尝试获取所需数据等内容[^4]. #### 三、最佳实践建议 - 总是优先考虑能否合理地吸收掉低层次组件上报来的麻烦事而非轻易放弃不管不顾任其扩散开来危害更大范围内的健康生态体系平衡稳定局面; - 对每一个单独列出待解决事项都要给予足够的重视程度直至彻底消除隐患为止才算合格完成任务指标考核标准要求下的质量控制环节管理工作流程当中不可或缺的重要组成部分之一而已啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值