【发布时间】:2020-07-15 20:16:42
【问题描述】:
值得一提的是,我使用 maven 作为构建管理工具。我有一个 jar(我们称之为 dep.jar),它将作为依赖项包含在最终项目(final.jar)中。
dep.jar 有一个带有 main 方法的类。
我需要在我的final.jar 的顶级目录中有几个入口点(带有主要方法的类),以便我可以根据需要使用入口点。包括来自dep.jar的一位。
我考虑过:
- 在 jar 中更改
META-INF/MANIFEST.MF文件。正如 Oracle 所说,无法引用 jar 依赖项中的主类(BOOT-INF/lib目录)-> https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html; - Uber jar - 不是一个选项,我依赖于 Java 代码库中的 jar 目录结构
- 使用像 http://www.jdotsoft.com/JarClassLoader.php 这样的特殊类加载器。但这意味着更改
final.jar的主要方法,由于项目限制,我不能这样做。 - 使用
maven-dependency-plugin,但它可以解压内部jar(dep.jar)并将类复制到maven工作目录target,在打包阶段将打包到BOOT-INF/classes目录。同样,我不能从那里引用主要类。如果我解压缩并将它们复制到不同于target的位置 - 复制的类将不会出现在我的final.jar中
是否有任何其他插件或选项如何在 JAR 构建期间将类从 final.jar 依赖 jar dep.jar 添加到 final.jar 的顶层?
编辑:
final.jar 项目如下:
final.jar
|_______BOOT-INF
|_______lib
| |_______dep.jar (contains main class I want to invoke)
|_______classes
|__________dir (directory I want to copy on demand with help of CLI)
【问题讨论】:
-
你说的是spring boot应用吗?
-
是和不是。我有两个入口点 - 一个启动 spring 应用程序,另一个(
dep.jar的)不是。所以我不能为此使用弹簧插件如果这就是你的要求。 -
这里重要的是,您的第一个citizen 应用程序是一个spring boot 应用程序,这意味着依赖项位于
BOOT-INF/lib,这意味着您无法以任何通常的方式访问它们。你可以做的是在spring boot中创建一个单独的入口点(一个额外的extrypoint)dzone.com/articles/configuring-a-main-class-in-spring-boot但是结合第二个入口点,你可以从类加载模糊开始......问题是:你为什么需要那个? -
我需要创建一个 CLI 来处理在 spring 应用程序构建期间创建的文件。我需要为此使用
final.jar,以便我可以访问这些文件。但我不想初始化 spring 上下文,因为它太重了。所以我想在没有春天的情况下有第二个入口点。我可以顺便使用maven-dependency-plugin访问BOOT-INF/lib中的依赖项。但我不知道如何将它们放在final.jar的顶层。 -
现在我完全糊涂了。您在构建期间生成文件,但需要通过运行时使用它们,而不是用于 Spring Boot 应用程序。为什么不将它们打包为资源并使用它们。我在链接中给了你第二个没有弹簧的入口点。你能解释一下这些文件的用途吗?从我的角度来看听起来很奇怪?...
标签: java maven build jar compilation