子项目之间的Gradle依赖关系

时间:2018-04-25 12:38:50

标签: java gradle

我试图弄清楚在gradle中声明项目依赖的正确方法,我有两个子项目:

一个Java应用程序

apply plugin: 'java'

sourceSets {main {java {srcDirs = ['./']}}}
dependencies{compile project(':p2')}

jar {manifest.attributes(
        'Class-Path': configurations.runtime.files.collect { it.name }.join(''),
        'Main-Class': 'Main'
    )
}

和一个java库:

apply plugin: 'java-library'

sourceSets {main {java {srcDirs = ['./']}}
}

jar {
   manifest.attributes(
    'Class-Path': configurations.runtime.files.collect { it.name }.join(' ')
)
}

根项目为空,设置只包括子项目。

p1项目中的dependencies只告诉p2必须在p1之前构建,但是如何将p2配置为p1的lib呢?现在如果运行p1我得到: Exception in thread "main" java.lang.NoClassDefFoundError: StaticClass

Gradle构建很好:

C:\...>gradle build
BUILD SUCCESSFUL in 1s
4 actionable tasks: 4 up-to-date

我必须将p2.jar复制并粘贴到p1.jar目录才能正常运行,我该如何为我做这件事呢?

2 个答案:

答案 0 :(得分:1)

如果您尝试将p2的课程打包到p1 jar中,请尝试将其添加到p1' s build.gradle

jar {
    from project(':p2:').sourceSets.main.output
}

但这有点不寻常。通常,如果您已经设置了一个单独的库项目,则将其打包在一个单独的jar中并将其添加到依赖项目的类路径中,以便它可以重复使用。

在jar的清单上设置Class-Path不会按照你编写的方式工作。 manifest属性将每个条目解释为相对于JVM的工作目录的文件路径,但您只是给它每个jar的名称,并且Gradle在设置配置类路径时,不会复制或移动文件。依靠清单来设置类路径通常不是一个好主意,因为只有当你的jar文件系统完全按照清单所期望的那样安排在文件系统上时它才会起作用。如果这真的是你想要的,那么你需要设置一个'安装'包含按预期排列的所有必需jar的目录。 Gradle Application Plugin可能可以帮助您实现这一目标,或类似的东西,但我从未使用它。

答案 1 :(得分:1)

根据您的具体需求,您应该查看java-library-distribution pluginapplication plugin

  • 第一个将jar和它的依赖项打包在一个档案中。
  • 第二个将执行相同的操作,并允许您将主jar配置为可执行文件。