我正在编写一个Java库,我想用Gradle构建该库,然后从本地测试项目对其进行测试。
我更喜欢使用Gradle 3.3实现我的目标。
该库应为Java5及更高版本构建。
到目前为止,我的build.gradle
看起来像这样:
plugins {
id 'jvm-component'
id 'java-lang'
}
repositories {
mavenCentral()
}
model {
components {
main(JvmLibrarySpec) {
sources {
java {
dependencies {
module 'commons-codec:commons-codec:1.10'
module 'org.apache.httpcomponents:httpcore:4.4.6'
module 'org.apache.httpcomponents:httpclient:4.5.3'
}
}
}
api {
exports 'io.simplepush'
}
targetPlatform 'java5'
}
}
}
该库的源代码位于
src/main/java/io/simplepush/Notification.java
中,并取决于build.gradle
文件中声明的依赖性。使用
./gradlew build
构建库可以正常工作并生成build/jars/main/jar/main.jar
。但是,当我从IntelliJ运行测试项目时(在将
main.jar
包含到测试项目中之后),出现以下运行时错误:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/HttpEntity
。似乎测试项目不知道我的库所需的运行时依赖项。
我不确定告诉测试项目有关我的库的依赖关系的正确方法是什么。
我不想要一个包含所有依赖项的胖子。
列出测试项目本身中的所有依赖项也不是一个选择。
最好是我希望库本身告诉测试项目它需要哪些依赖项。
最佳答案
您创建的库jar不包含任何依赖关系信息,IDE/Gradle可以将其解析为能够编译/运行测试项目的信息。我看到您正在使用Maven中央存储库,因此您需要做的就是将您的库发布到本地Maven存储库,然后在测试项目中仅添加一个依赖项信息(不仅仅是普通的jar文件)。
因此,在库和测试项目build.gradle
中都添加一个maven本地存储库配置。
repositories {
mavenLocal()
mavenCentral()
}
现在,您需要将库发布到本地存储库。在使用gradle 3.3时,可以使用Maven Publishing。
因此,在
build.gradle
库中添加了一个行家发布信息。publishing {
publications {
maven(MavenPublication) {
groupId 'io.simplepush'
artifactId 'project1-sample'
version '1.1'
from components.java
}
}
}
Gradle的“maven-publish”插件可轻松将其发布到本地存储库,从而自动创建PublishToMavenLocal任务。
这样你就可以运行
它将把包含所有依赖项信息的库发布到本地Maven存储库中。
然后,您只需要向测试项目添加库信息
build.gradle
dependencies {
// other dependencies .....
module 'io.simplepush:project1-sample:1.1'
}