繁体   English   中英

管理在运行时从类路径加载数据的Java类的数据依赖性

[英]Managing Data Dependecies of Java Classes that Load Data from the Classpath at Runtime

管理类路径中存在的数据文件的Java类依赖关系的最简单方法是什么?

进一步来说:
应该如何注释数据依赖性? 也许使用Java注释(例如@Data)? 或者更确切地说,在构建脚本或属性文件中构建条目? 是否有构建工具来集成和评估此类信息(Ant,Scons,...)? 你有例子吗?

请考虑以下情形:
几行Ant从我的源代码创建一个Jar,其中包含在类路径中找到的所有内容。 然后jarjar用于删除所有不必执行的.class文件,比如,类Foo。 问题是Bar类所依赖的所有数据文件仍然存在于Jar中。 但是,理想的部署脚本会识别出,只有类别Bar所依赖的数据文件才能被删除,而必须保留类Foo所依赖的数据文件。

任何提示?

这是Maven已经通过构建,依赖和资源管理解决的众多问题之一。 任何maven项目都遵循一个标准的目录布局,它规定了你应该放置数据文件的位置:在'resources'目录中。 传统的Maven目录结构如下......

/
/src/
/src/main/java/
/src/main/java/App.java
/src/main/resources/
/src/main/resources/my.prod.data.or.cfg.or.whatever
/src/test/java/
/src/test/java/AppTest.java
/src/test/resources/
/src/test/resources/my.test.data.or.cfg.or.whatever
/pom.xml

这样做的好处是,'main'(prod)资源目录中包含的所有文件都可以在运行时从Classpath中使用。 所有'test / resources'文件在构建和单元测试时都可用于您的代码,但不包含在您的最终工件中。

你不能重构你的项目,以便你有子模块,每个子模块包含项目本身的相关文件; Bar类和Bar相关文件将打包在它们的包中,而Foo包将打包到另一个?

另一种可能性是使用一些包命名约定来过滤你想要在你的包中看到的文件。

我不认为您描述的系统存在通用解决方案,但是,我只是在使用ASM读取类的注释,因为jarjar也使用它。 以这种方式读取注释数据并不困难(将ClassVisitor传递给ClassReader上的accept()方法,并对visitAnnotation回调做一些有用的事情)。 这意味着您可以尝试将您的预期行为包含在jarjar中,也可以将其作为自定义步骤添加到构建过程中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM