如何使用Gradle构建Maven项目,作为对根项目的依赖?

时间:2017-08-15 13:29:49

标签: java maven gradle

我有一个包含多个子项目的根项目。最初,我们将项目保留为单独的Maven项目,但我已经意识到Gradle更适合我使用。但对于其中一个子项目,我们宁愿不将其转换为Gradle项目,而是将其保留为Maven项目。

因此,我尝试将Maven项目作为Gradle项目的子项目,但构建失败,因为Maven项目pom.xml中列出的依赖项未包含在内。以下是我的实验

文件夹/项目结构

root (gradle root project)
|- api (maven project)
|- project (gradle subproject, depends on the "api" project)

根/ settings.gradle

rootProject.name = 'root'

def subDirs = rootDir.listFiles(new FileFilter() {
    public boolean accept(File file) {
        if (!file.isDirectory()) {
            return false
        }
        if (file.name == 'buildSrc') {
            return false
        }
        return new File(file, 'build.gradle').isFile()
    }
});

subDirs.each { File dir ->
    include dir.name
}

根/的build.gradle

import org.gradle.api.artifacts.*

apply plugin: 'base' // To add "clean" task to the root project.

subprojects {
    apply from: rootProject.file('common.gradle')
}

task mergedJavadoc(type: Javadoc, description: 'Creates Javadoc from all the projects.') {
    title = 'All modules'
    destinationDir = new File(project.buildDir, 'merged-javadoc')

    // Note: The closures below are executed lazily.
    source {
       subprojects*.sourceSets*.main*.allSource
    }
    classpath.from {
        subprojects*.configurations*.compile*.copyRecursive({ !(it instanceof ProjectDependency); })*.resolve()
    }
}

根/ common.gradle

//
// This file is to be applied to every subproject.
//

apply plugin: 'java'
apply plugin: 'maven'

String mavenGroupId = 'com.mycompany.myproject'
String mavenVersion = '1.0-SNAPSHOT'

sourceCompatibility = '1.8'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

repositories {
    mavenCentral();
    // You may define additional repositories, or even remove "mavenCentral()".
    // Read more about repositories here:
    //   http://www.gradle.org/docs/current/userguide/dependency_management.html#sec:repositories
}

dependencies {
    // Adding dependencies here will add the dependencies to each subproject.
    testCompile group: 'junit', name: 'junit', version: '4.10'
}

String mavenArtifactId = name

group = mavenGroupId
version = mavenVersion

task sourcesJar(type: Jar, dependsOn: classes, description: 'Creates a jar from the source files.') {
    classifier = 'sources'
    from sourceSets.main.allSource
}

artifacts {
    archives jar
    archives sourcesJar
}

configure(install.repositories.mavenInstaller) {
    pom.project {
        groupId = mavenGroupId
        artifactId = mavenArtifactId
        version = mavenVersion
    }
}

task createFolders(description: 'Creates the source folders if they do not exist.') doLast {
    sourceSets*.allSource*.srcDirs*.each { File srcDir ->
        if (!srcDir.isDirectory()) {
            println "Creating source folder: ${srcDir}"
            srcDir.mkdirs()
        }
    }
}

根/ API / pom.xml的

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany.myproject</groupId>
    <artifactId>api</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/de.dev-eth0.dummycreator/dummy-creator -->
        <dependency>
            <groupId>de.dev-eth0.dummycreator</groupId>
            <artifactId>dummy-creator</artifactId>
            <version>1.3</version>
        </dependency>
    </dependencies>
</project>

根/项目/的build.gradle

if (!hasProperty('mainClass')) {
    ext.mainClass = 'com.mycompany.myproject.HelloWorld'
}

dependencies {
    compile project(":api")
}

根/ API / SRC /主/ JAVA / COM / myCompany的/ myproject的/ API / Api.java

package com.mycompany.myproject.api;

import org.dummycreator.DummyCreator;

public class Api {

    public static void sayHello() {
        System.out.println("Hello from API!");

        DummyCreator dc = new DummyCreator();
        Integer integer = dc.create(Integer.class);

        System.out.println("Integer: " + integer);
    }
}

在构建&#34; project&#34;时,我得到以下输出:

Executing: gradle build
Arguments: [-c, C:\Users\birger\Desktop\test\root\settings.gradle]

C:\Users\birger\Desktop\test\root\api\src\main\java\com\mycompany\myproject\api\Api.java:3: error: package org.dummycreator does not exist
import org.dummycreator.DummyCreator;
                       ^
C:\Users\birger\Desktop\test\root\api\src\main\java\com\mycompany\myproject\api\Api.java:10: error: cannot find symbol
        DummyCreator dc = new DummyCreator();
        ^
  symbol:   class DummyCreator
  location: class Api
C:\Users\birger\Desktop\test\root\api\src\main\java\com\mycompany\myproject\api\Api.java:10: error: cannot find symbol
        DummyCreator dc = new DummyCreator();
                              ^
  symbol:   class DummyCreator
  location: class Api
3 errors
:api:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':api:compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 0.106 secs



Build failure (see the Notifications window for stacktrace): gradle build

那么,作为Gradle根项目的子项目,制作Maven子项目&#34;构建为正常&#34;的最简单方法是什么,而不必实际将其转换为Gradle项目?< / p>

1 个答案:

答案 0 :(得分:0)

如果您在maven项目上调用mvn install,则可以使用

repositories { 
    mavenLocal()
}
在gradle项目中

通过组/工件/版本依赖jar。使用gradle的maven依赖集成,您将获得来自pom的所有传递依赖