如何在我的类路径中获取多项目 gradle springoboot 应用程序的库 jar?
Posted
技术标签:
【中文标题】如何在我的类路径中获取多项目 gradle springoboot 应用程序的库 jar?【英文标题】:How can I get in a multi-project gradle springoboot application a library jar in my classpath? 【发布时间】:2021-10-04 04:18:01 【问题描述】:我正在使用 IntelliJ 开发一个多项目 gradle springboot 应用程序。我将 Gradle 用于依赖项和 jar 包含。
主模块(springboot)包括另外两个,其中一个使用外部库,我们无法控制它必须位于我的目录中。此外部库包含位于特定文件夹中的自己的设置。
当我创建主 jar(我要执行的那个)时,它包括所有依赖的 jar、两个模块 jar 以及外部库 jar。
首先,我尝试在需要库的模块的 resources/META-INF/MANIFEST.MF 上添加类路径,但是当我的 intelliJ 创建 Jar 时,资源被删除。 因此,因为该库使用位于 jar 后面 2 个目录的 /configs 目录中的设置。在找到库 jar 之前,我还尝试在主 jar 2 目录中添加 /config 目录和我的配置,但它不能正常工作。该程序无法找到其配置。
另一方面,我尝试从主 jar 中删除库 jar 并使用以下命令运行主 jar:
Java –cp (library directory) –jar (main jar)
还有
java -cp myJar.jar;/lib/xxx -Dloader.main=myMainApplicationClass org.springframework.boot.loader.PropertiesLauncher
[xxx代表查找库jar之前的一个目录]
见消息Spring Boot Executable Jar with Classpath)
但是我得到一个 ClassNotFoundException 错误,所以使用该库的模块找不到它。 如何添加库 jar 和一个模块所需的设置?所以当我运行主 jar 时,它会正确加载它们。
最后,我必须补充一点,如果我从 IntelliJ 运行应用程序,则程序可以正常工作。问题是当我想使用主 jar 从命令行运行应用程序时。
谢谢!
示例:
Example from what I have and what I want (Structure)
配置目录必须在外部库 .JAR 的外部
来自模块 A 的 build.gradle:
plugins
id 'java'
group 'MYCOMPANY.GROUP'
version '0.0.1-SNAPSHOT'
repositories
mavenCentral()
dependencies
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
implementation group: 'org.projectlombok', name: 'lombok', version: '1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
implementation files('MODULE B.JAR')
implementation files('EXTERNAL LIBRARY .JAR')
implementation group: 'com.android.tools.build', name: 'gradle', version: '2.3.0'
//Includes
implementation group: 'javax.mail', name: 'mail', version: '1.4.7'
implementation 'org.apache.poi:poi:5.0.0'
implementation 'org.apache.poi:poi-ooxml:5.0.0'
//Includes from utils
implementation group: 'net.sourceforge.jexcelapi', name: 'jxl', version: '2.6.12'
implementation group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.12.39'
test
useJUnitPlatform()
来自模块B的build.gradle:
group 'MYCOMPANY.GROUP'
version '0.0.1-SNAPSHOT'
repositories
mavenCentral()
dependencies
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.12.3'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.12.3'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.3'
test
useJUnitPlatform()
build.gradle 来自 main
plugins
id 'org.springframework.boot' version '2.5.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
group = 'MYCOMPANY.GROUP'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations
compileOnly
extendsFrom annotationProcessor
repositories
mavenCentral()
dependencies
implementation files('MODULE A.JAR')
implementation files('MODULE B.JAR')
//This includes the external library into main.JAR
//Allows to external library find the configs directory into JAR resources
implementation files('EXTERNAL LIBRARY .JAR')
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.aspectj:aspectjweaver:1.9.2'
implementation 'org.apache.poi:poi:5.0.0'
implementation 'org.apache.poi:poi-ooxml:5.0.0'
implementation group: 'com.google.guava', name: 'guava', version: '30.1.1-jre'
implementation group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver', version: '3.141.59'
implementation 'org.json:json:20210307'
implementation group: 'com.android.tools.build', name: 'gradle', version: '2.3.0'
test
useJUnitPlatform()
【问题讨论】:
你能展示一下项目结构或给我们一个最小的例子吗? 给你!谢谢! 嗨@Marc,你能粘贴主模块和模块B的build.gradles
吗?我很容易重现这个案例。谢谢
给你!谢谢!
你的意思是你的项目结构有/path/to/rooProject/projectA/build.gradle
和/path/to/rooProject/projectB/build.gradle
,还有一个外部库/path/to/externalProject/build.gradle
和/path/to/externalProject/src/main/resources/config/application.properties
?
【参考方案1】:
您可以尝试不包含externalLibrary.jar
,方法是将main
和a
的build.gradle
文件中的依赖项更改为:
dependencies
...
compileOnly files("path/to/folder/externalLibrary.jar")
testImplementation files("path/to/folder/externalLibrary.jar")
...
然后通过这个命令启动你的 Spring 应用程序:
$ java -Dloader.path=path/to/folder/ -jar path/to/main.jar
我已经测试了这个设置并且它可以工作。但是,我不知道externalLibrary.jar
如何与configs/custom.properties
交互。如果它通过类路径而不是文件系统读取它,事情可能会更加复杂。
【讨论】:
感谢您的奉献!!不幸的是,它不能正常工作。当我的程序试图搜索 externalLibrary.jar 中的类时,我得到了 java.lang.ClassNotFoundException。我已经通过将 configs 目录放在与main.jar
相同的路径以及与externalLibrary.jar
相同的路径进行测试,但它不起作用。仅当我在 main.jar
中有 configs/custom.properties
时才有效以上是关于如何在我的类路径中获取多项目 gradle springoboot 应用程序的库 jar?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 gradle 中获取 spring-boot 依赖版本?
将 com.google.gms:google-services:4.3.10 添加为项目 build.gradle 文件的类路径后下载时出现问题