简体   繁体   English

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

[英]How can I build a Maven project, as a dependency to the root project, with Gradle?

I have a root project with multiple subprojects. 我有一个包含多个子项目的根项目。 Initially, we've kept the projects as separate Maven projects but I've realized Gradle is much more suitable for me to use. 最初,我们将项目保留为单独的Maven项目,但我意识到Gradle更适合我使用。 But for one of the subprojects we'd rather not convert it to a Gradle project, but keep it as a Maven project. 但是对于其中一个子项目,我们不希望将其转换为Gradle项目,而应将其保留为Maven项目。

So I've tried to keep a Maven project as a subproject to a Gradle project, but building fails because the dependencies listed in the Maven projects pom.xml are not included. 因此,我尝试将Maven项目保留为Gradle项目的子项目,但是构建失败,因为未包含Maven项目pom.xml中列出的依赖项。 Below is my experiment 以下是我的实验

Folder/project structure 文件夹/项目结构

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

root/settings.gradle root / 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
}

root/build.gradle root / 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()
    }
}

root/common.gradle root / 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()
        }
    }
}

root/api/pom.xml root / 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>

root/project/build.gradle 根/项目/ build.gradle

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

dependencies {
    compile project(":api")
}

root/api/src/main/java/com/mycompany/myproject/api/Api.java 根目录/api/src/main/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);
    }
}

When building "project", I get the following output: 在构建“项目”时,我得到以下输出:

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

So, what's the easiest way to make the Maven subproject "build as normal", as a subproject of the Gradle root project, without actually having to convert it to a Gradle project? 因此,最简单的方法是使Maven子项目作为Gradle根项目的子项目“正常构建”,而不必实际将其转换为Gradle项目?

If you called mvn install on the maven project, you could then use 如果您在maven项目上调用了mvn install ,则可以使用

repositories { 
    mavenLocal()
}

in the gradle project to depend on the jar via group/artifact/version. 在gradle项目中,通过group / artifact / version依赖jar。 With gradle's maven dependency integration you would then get all of the transitive dependencies from the pom 使用gradle的maven依赖项集成,您可以从pom中获取所有传递性依赖项

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM