maven项目作为gradle项目中的依赖项

时间:2016-03-04 11:46:01

标签: maven gradle

我有一个项目使用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的影响,但我不想做任何这些。

有人能指出我正确的方向吗?

2 个答案:

答案 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,但这并不理想,因为它不会获取传递依赖项,您必须自己手动添加它们。