首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个项目获取项目文件系统位置

从另一个项目获取项目文件系统位置
EN

Stack Overflow用户
提问于 2022-03-26 22:29:23
回答 2查看 45关注 0票数 0

我正在进行一个多项目构建,在该构建中,我需要获取项目中的所有.class文件,然后通过其文件系统位置通过反射加载所有这些文件,考虑到这个项目结构:

代码语言:javascript
复制
multi-project
|_ /app/
|   |_ src/
|_ /notification/
|   |_ /src/
|_ settings.gradle

在这个多项目构建中,我的应用程序项目依赖于这样的通知项目

代码语言:javascript
复制
dependencies {
    implementation project(":notification")
    // other dependencies
}

虽然在这一点上它看起来像一个与等级相关的问题,但它不是,它是与构建工具无关的。

目前我正在处理app项目,但是我需要动态加载位于通知项目上的所有类,我通常通过检查项目的文件位置来实现这一点,但是我需要从位于app项目中的类中获取通知项目的位置。

为了捕获路径,我使用ClassLoader.getResources()加载了app项目的所有类,但是这个类加载器无法捕获通知项目的路径

EN

回答 2

Stack Overflow用户

发布于 2022-03-26 23:06:17

类路径抽象根本上没有“列表资源”的概念。它只是“给我资源X",这就是全部。

因此,“我希望获得所有类的列表,以便通过反射加载它们”是不可能没有黑客的。

幸运的是,有一个实际的解决办法。资源清单。通常,通过使用SPI ()系统。

在编译期间(在编译过程中,编译器/构建工具确实有一个完整的清单,列出了它正在编译的所有内容),将创建一个文本文件。它包含每个相关类的完全限定类名,每一行一个这样的名称。然后将这个文本文件包含在jar文件中。现在,您可以使用java的ClassLoader公开的API构建‘给我每个项目X类的一个实例’的过程。

  • 加载资源“/meta/services/com.foo.YourInterface”并逐行读取它。
  • 每一行运行Class.loadClass(thatLine).getConstructor().newInstance(),将其转换为com.foo.YourInterface并将其添加到列表中。
  • 把名单还给我。

瞧。不需要“列表”指令(不存在)。在查找SQL驱动程序、字符集编码驱动程序、密码实现等方面,java本身就是这样工作的。

如何做到这一点的基础取决于您的构建系统。编译步骤(“创建一个包含所有实现的文本文件”)依赖于构建;您可以手工编写它,也可以编写自己的构建插件,或者使用现有的注释处理器扫描注释并自动生成它。

运行时组件(使用类路径上的文本文件,即在类文件所在的jar中,加载其中列出的每个类,实例化它们,并将其作为实例列表返回给我)被烘焙到java本身:ServiceLoader中。

票数 0
EN

Stack Overflow用户

发布于 2022-03-26 23:40:40

我想我不是很清楚,因为这是我的第一个问题,我只是需要文件系统路径到另一个项目,我可以找到我正在寻找的通过使用System.getProperty("java.class.path")

它包含到我需要的项目的编译jar的路径,它不是我需要的路径,但我仍然可以获得该文件的条目,它与路径本身一样有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71632299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档