我目前有以下项目结构:
parentModule
├── moduleA
│ └── pom.xml <--- moduleA POM
└── pom.xml <--- parentModule POM
我想要达到的目标:
最终的结果是我想要有两个不同的jar文件,它们都是moduleA
的版本,但它们之间有细微的差异。例如,一个版本的moduleA
应该禁用它的一个特性,同时有效地覆盖另一个特性。
我不希望用户必须处理配置文件或设置,只希望能够为每个变体下载预构建的jar文件。
一个具体的例子是,我想要一个版本的moduleA
来解析洋葱地址到一个连接对象,但我想要一个不同版本的moduleA
来解析正常的IP地址到一个连接对象。对于这个特定的问题,我设想创建一个依赖于moduleA
专门用于使用的模块-通过添加tor库作为依赖项,并以某种方式覆盖moduleA
中当前的地址解析方法,使其仅适用于tor洋葱地址。
我当前的方法:
我一直在想,在这种情况下,反射可能是有用的,并设想了以下项目结构:
parentModule
├── moduleA
│ ├── src/package/Resolver.java <--- Resolver interface
│ ├── moduleA-normal
│ │ └── src/package/ResolverImpl.java <--- ResolverImpl implementing Resolver
│ │ └── pom.xml <--- moduleA-normal POM
│ ├── moduleA-tor
│ │ └── src/package/ResolverImpl.java <--- ResolverImpl implementing Resolver
│ │ └── pom.xml <--- moduleA-tor POM
│ └── pom.xml <--- moduleA POM
└── pom.xml <--- parentModule POM
使用这种方法,我怀疑我可以使用反射来访问编译到最终jar中的ResolverImpl
。虽然,我仍然没有看到一个简单的方法来禁用moduleA
的核心组件,如流视频的能力。也许这个组件应该不再像我所创造的那样是一个"核心组件",因为目前我只是假设它会在那里。我是否应该做类似于上面建议的地址解析解决方案(使用接口和反射)?
是否有更好的方法来做我想要达到的目标,我如何才能正确地实现这一点?
如果你不想要一个外部对于jar文件,编写一次代码(在common
模块中),然后创建单独的模块(仅在资源中的配置文件中有所不同)可能是值得的。