英文:
Gradle multi-module project compilation fails with "classNotFoundExceptions" from dependencies mentioned in sub-modules
问题
我有一个Java项目的多模块设置,结构如下。
mainApp
|--> core-module
| |--> src
| |--> build.gradle
|--> implementation group: 'org.apache.axis2', name: 'axis2-kernel', version: '1.7.8'
|--> implementation group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.4.13'
|--> implementation files('libs/some_local.jar')
|--> compile project(":lib-module")
|--> compile project(":lib-another-module")
|--> ...
|
|--> lib-module
| |--> src
| |--> build.gradle
|--> implementation group: 'commons-lang', name: 'commons-lang', version: '2.6'
|--> implementation files('libs/another_local.jar')
|--> ...
|--> lib-another-module
| |--> src
| |--> build.gradle
|--> implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
|--> implementation files('libs/another_local.jar')
|--> ...
|
|--> settings.gradle
|--> build.gradle
|--> gradle.properties
在 mainApp/build.gradle
文件中,我有一个名为 mentioned
的子模块,如下所示:
sourceSets {
main {
java {
srcDirs project('core-module').file("src")
srcDirs project('lib-module').file("src")
srcDirs project('lib-another-module').file("src")
}
}
}
如果我单独构建子模块,则可以成功编译,但当我在根目录运行 ./gradlew compileJava
时,它会因为在子模块中已经提到过的 JAR 包引发 classNotFoundExceptions
错误。
> Task :core-module:compileJava
//编译成功
> Task :lib-module:compileJava
//编译成功
> Task :lib-another-module:compileJava
//编译成功
> Task :compileJava
/.../core-module/src/java/../OAuthUtils.java:12: error: package org.apache.http does not exist
import org.apache.http.Header;
...
//失败!
在这里,./gradlew core-module:compileJava
是完美工作的,但从根目录调用编译时会失败。
- 我该如何处理这个问题?
- 是否因为从文件系统引用了一些本地的 JAR 包?
编辑
我发现指向子 sub-module
的根 sourceSets{}
的编译失败,而单独的 sub-module
编译是成功的。
但是,我需要这个 sourceSets{}
来创建包含所有 sub-module
的一个单体 JAR 包。
注意: 我这里不是在创建 fatJar
或 shadedJar
,但我需要在不包含依赖 JAR 包的情况下包括所有 sub-module
的所有包。
英文:
I have a multi-module setup for a Java project with following structure.
mainApp
|--> core-module
| |--> src
| |--> build.gradle
|--> implementation group: 'org.apache.axis2', name: 'axis2-kernel', version: '1.7.8'
|--> implementation group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.4.13'
|--> implementation files('libs/some_local.jar')
|--> compile project(":lib-module")
|--> compile project(":lib-another-module")
|--> ...
|
|--> lib-module
| |--> src
| |--> build.gradle
|--> implementation group: 'commons-lang', name: 'commons-lang', version: '2.6'
|--> implementation files('libs/another_local.jar')
|--> ...
|--> lib-another-module
| |--> src
| |--> build.gradle
|--> implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
|--> implementation files('libs/another_local.jar')
|--> ...
|
|--> settings.gradle
|--> build.gradle
|--> gradle.properties
In mainApp/build.gradle
file I have a 'mentioned' sub-modules as
sourceSets {
main {
java {
srcDirs project('core-module').file("src")
srcDirs project('lib-module').file("src")
srcDirs project('lib-another-module').file("src")
}
}
}
If I build individual sub-module it get compiled successfully but when I run ./gradlew compileJava
at root , it fails with classNotFoundExceptions
from the jars which I've already mentioned in sub-modules
> Task :core-module:compileJava
//successful
> Task :lib-module:compileJava
//successful
> Task :lib-another-module:compileJava
//successful
> Task :compileJava
/.../core-module/src/java/../OAuthUtils.java:12: error: package org.apache.http does not exist
import org.apache.http.Header;
...
//FAILED!
Here ./gradlew core-module:compileJava
works perfectly but compilation fails when invoked from root.
- How shall I deal with it?
- Is it because of some local jars referred from file-system?
EDIT
I found that the compilation of root sourceSets{}
which is pointing to child sub-module
is failing and individual sub-module
compilation is successful.
But, I need this sourceSets{}
for creating one monolithic jar of all sub-module
Note:- I'm not creating fatJar
or shadedJar
here, But I need to include all packages from all sub-modules
without dependency jars.
答案1
得分: 0
这是我成功创建单个大型JAR文件,其中包括所有“子模块”的方法:
jar {
dependsOn compileJava
manifest {
def userName = System.properties['user.name']
def javaVersion = JavaVersion.current()
attributes 'Manifest-Version': "1.0"
attributes 'Built-By': userName
attributes 'Created-By': "Java Version: " + javaVersion
}
destinationDir(file("$buildDir/image"))
baseName(jarName)
from project('core-module').sourceSets.main.output.classesDirs
from project('lib-module').sourceSets.main.output.classesDirs
from project('lib-another-module').sourceSets.main.output.classesDirs
}
英文:
This how I'm successfully able to create the one monolithic jar from all sub-module
jar {
dependsOn compileJava
manifest {
def userName = System.properties['user.name']
def javaVersion = JavaVersion.current()
attributes 'Manifest-Version' : "1.0"
attributes 'Built-By' : userName
attributes 'Created-By' : "Java Version: " + javaVersion
}
destinationDir(file("$buildDir/image"))
baseName(jarName)
from project('core-module').sourceSets.main.output.classesDirs
from project('lib-module').sourceSets.main.output.classesDirs
from project('lib-another-module').sourceSets.main.output.classesDirs
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论