将替代服务实现添加到类路径

Add alternative service implementation to the classpath

我有一些 CDI 应用程序,它作为带有 bootstrap main class:

的 fatjar 启动
java $ARGS -jar foo_cdi.jar

由于某些原因我无法更改此命令行,我也无法更改foo_cdi.jar

但是我可以配置$ARGS环境变量。

我需要的是在 class 路径中添加一些额外的 additional.jar(假设它位于与 foo.jar 相同的目录中)。

additional.jar 包含一些服务的替代实现,用于我在 foo_cdi.jar 中的 CDI 应用程序。

当然 additional.jar 包含 META-INF/beans.xml 和 scan/include 路径并编译 classes 标记为

@Alternative
@Priority(Interceptor.Priority.APPLICATION + 1)

然而,仅仅将 ARGS 设置为 -classpath additional.jar 是行不通的。我猜这是因为 -jar 选项:

When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.

所以我的问题是:有什么办法可以解决这个难题吗?

目前只有一个黑客解决方案建议我使用自己的 javaagent,它将用我自己的实现重新定义所需的 classes。但在我看来,这是一个下流而肮脏的黑客行为。

(虽然我能做到:

java -javaagent:additional.jar foo_cdi.jar)

还有其他想法吗?

您可以使用 -Xbootclasspath/a:additional.jar for Java 8 将库附加到启动类路径。