我有一个项目使用Gradle作为构建工具,第二个子项目使用Maven的POM。我没有在子项目上更改构建工具的自由。
我想要实现的是将我的项目与Maven POM一起添加为我的Gradle项目的依赖项。
如果root(当前目录)是我的Gradle项目并包含build.gradle
,则Maven项目位于vendor/other-proj/
下,POM文件位于该目录下。
我在build.gradle
文件中尝试了这些变体:
第一次尝试:
include("vendor/other-proj/")
project(':other-proj') {
projectDir = new File("vendor/other-proj/pom.xml")
}
dependencies {
compile project(':other-proj')
}
第二次尝试:
dependencies {
compile project('vendor/other-proj/')
}
第3次尝试:
dependencies {
compile project('vendor/other-proj/pom.xml')
}
第四次尝试:
dependencies {
compile files 'vendor/other-proj/pom.xml'
}
我在网上找不到任何相关内容,似乎大多数Gradle / Maven用例都会受到发布到Maven或生成POM的影响,但我不想做任何这些。
有人能指出我正确的方向吗?
答案 0 :(得分:16)
你可以“假装”包括像这样的Maven项目:
dependencies {
compile files("vendor/other-proj/target/classes") {
builtBy "compileMavenProject"
}
}
task compileMavenProject(type: Exec) {
workingDir "vendor/other-proj/"
commandLine "/usr/bin/mvn", "clean", "compile"
}
这样Gradle将在编译之前执行Maven构建(compileMavenProject
)。但请注意,它不是传统意义上的Gradle“项目”,并且不会出现,例如如果你运行gradle dependencies
。将已编译的类文件包含在Gradle项目中只是一个hack。
编辑: 您可以使用类似的技术来包含maven依赖项:
dependencies {
compile files("vendor/other-proj/target/classes") {
builtBy "compileMavenProject"
}
compile files("vendor/other-proj/target/libs") {
builtBy "downloadMavenDependencies"
}
}
task compileMavenProject(type: Exec) {
workingDir "vendor/other-proj/"
commandLine "/usr/bin/mvn", "clean", "compile"
}
task downloadMavenDependencies(type: Exec) {
workingDir "vendor/other-proj/"
commandLine "/usr/bin/mvn", "dependency:copy-dependencies", "-DoutputDirectory=target/libs"
}
答案 1 :(得分:8)
您无法在gradle settings.gradle中“包含”maven项目。最简单的方法是构建maven项目并使用repositories{
mavenLocal()
}
dependencies{
compile 'vendor:otherproj:version'
}
(可以是默认的.m2或任何其他自定义位置)将其安装到本地仓库,然后使用groupname:modulename:version从gradle项目中使用它
compile files
可以使用import java.util.List;
import java.util.Optional;
public class Optionals
{
interface BillingRemoteService
{Optional<ServiceBody> getServiceBody();}
interface ServiceBody
{Optional<ServiceResponse> getServiceResponse();}
interface ServiceResponse
{Optional<List<Customer>> getCustomersList();}
interface Customer
{Optional<BillAccountInfo> getBillAccountInfo();}
interface BillAccountInfo
{Optional<EcpId> getEcpdId();}
interface EcpId
{Optional<BillingRemoteService> getEcpdId();}
Object test(BillingRemoteService billingRemoteService) throws Exception
{
return
billingRemoteService.getServiceBody()
.flatMap(ServiceBody::getServiceResponse)
.flatMap(ServiceResponse::getCustomersList)
.map(l->l.get(0))
.flatMap(Optional::ofNullable)
.flatMap(Customer::getBillAccountInfo)
.flatMap(BillAccountInfo::getEcpdId).orElseThrow(()->new Exception("Failed to get information for Account Number "));
}
}
直接依赖maven项目的jar,但这并不理想,因为它不会获取传递依赖项,您必须自己手动添加它们。