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

管理运行时从类路径加载数据的Java类的数据依赖性,java,annotations,dependencies,build-automation,Java,Annotations,Dependencies,Build Automation,管理Java类对类路径中存在的数据文件的依赖关系的最简单方法是什么 更具体地说: 数据依赖关系应该如何注释?可能使用Java注释(例如,@Data)?或者更确切地说是生成脚本或属性文件中的某些生成条目?是否有集成和评估此类信息的构建工具(Ant、SCON等)?你有例子吗 考虑以下场景: 几行Ant代码从我的源代码创建了一个Jar,其中包含在类路径上找到的所有内容。然后使用jarjar删除执行类Foo所不需要的所有.class文件。问题是类Bar所依赖的所有数据文件仍然存在于Jar中。然而,理想的

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

更具体地说:
数据依赖关系应该如何注释?可能使用Java注释(例如,@Data)?或者更确切地说是生成脚本或属性文件中的某些生成条目?是否有集成和评估此类信息的构建工具(Ant、SCON等)?你有例子吗

考虑以下场景:
几行Ant代码从我的源代码创建了一个Jar,其中包含在类路径上找到的所有内容。然后使用jarjar删除执行类Foo所不需要的所有.class文件。问题是类Bar所依赖的所有数据文件仍然存在于Jar中。然而,理想的部署脚本应该认识到,只有类Bar依赖的数据文件可以删除,而类Foo依赖的数据文件必须保留


有什么提示吗?

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


另一种可能是使用一些包命名约定,以便能够过滤您希望在包中看到的文件。

这是它的构建、依赖关系和资源管理已经解决的许多问题之一。任何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)resources目录中包含的所有文件都可以从类路径在运行时供应用程序使用。所有的“测试/资源”文件在构建和单元测试期间都可供您的代码使用,但不包括在您的最终工件中。

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

谢谢您的回答,但恐怕这并不能解决问题:Maven是否显式注释App.java和my.prod.data.or.cfg.or.where之间的依赖关系?如果在部署过程中排除了前者,Maven会自动忽略后者吗?我不知道有任何内置注释提供您正在寻找的功能。但是,使用我上面解释的maven解决方案,您可以使用以下代码行。。。ClassLoader.getSystemResource(“classpath:/my.prod.data.or.cfg.or.which”)的“classpath:/”部分是可选的,因为默认情况下它会首先查看类路径,但我希望是显式的。考虑到这一点,编写自己的注释来包装这个实现应该不会太难。查看ClassLoader API,了解更多关于此方法及其其他方法的信息。希望这对正确的方向有所帮助。无论如何,将数据与代码分离是个好主意。但同样,这并不能解决在数据和类之间保持紧密联系的问题。最后,必须指出,不幸的是,Maven不支持这一点。是否没有构建系统实现解决方案?这将隐式地建模类对数据的依赖性,然而,在极端情况下,这意味着每个类一个项目,这是不可行的。此外,如果我的数据依赖关系决定了我的组件布局,我也不喜欢。同样,显式建模代码数据依赖关系的最简单和最常用的方法是什么?谢谢你的帮助!这听起来是一个有趣的方法。谢谢不过,我并不完全高兴,因为我必须自己做所有的工作,而且解决方案是专有的。