我试图找出在 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(' ')
)
}
根项目是空的,设置只包括子项目。
该dependencies
下的P1项目只告诉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 目录才能正常运行,我怎样才能让 gradle 为我做这件事?
如果您尝试将类打包p2
到p1
jar 中,请尝试将其添加到 p1's build.gradle
:
jar {
from project(':p2:').sourceSets.main.output
}
不过,这有点不寻常。通常情况下,如果你已经建立了一个单独的库项目,你将它打包在一个单独的 jar 中,并将其添加到依赖项目的类路径中,因此它是可重用的。
在 jar 的清单上设置 Class-Path 不会按照您编写的方式工作。manifest 属性将每个条目解释为相对于 JVM 工作目录的文件路径,但您只需为其指定每个 jar的名称,并且 Gradle 在设置配置类路径时不会复制或移动文件。依靠清单来设置类路径通常不是一个好主意,因为它只有在您的 jar 完全按照清单所期望的方式排列在文件系统上时才有效。如果这确实是您想要的,那么您需要设置一个“安装”目录,其中包含按预期排列的所有必需的 jar。该摇篮应用程序插件大概可以帮你实现这一目标,或等效的东西,但我”
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句