我正在编写一个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'
}

09-10 08:02
查看更多