如何在我的类路径中获取多项目 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,方法是将mainabuild.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 设置多项目 Grails?

如何在 gradle 中获取 spring-boot 依赖版本?

如何在我的 android 应用程序中更新 gradle

将 com.google.gms:google-services:4.3.10 添加为项目 build.gradle 文件的类路径后下载时出现问题

Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)

Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)