2017-08-15 2 views
1

Ich habe ein Root-Projekt mit mehreren Teilprojekten. Anfangs haben wir die Projekte als separate Maven-Projekte behalten, aber mir ist klar geworden, dass Gradle für mich besser geeignet ist. Aber für eines der Teilprojekte würden wir es lieber nicht in ein Gradle-Projekt umwandeln, sondern es als Maven-Projekt behalten.Wie kann ich ein Maven-Projekt als Abhängigkeit vom Root-Projekt mit Gradle erstellen?

Also habe ich versucht, ein Maven-Projekt als Teilprojekt zu einem Gradle-Projekt zu halten, aber das Bauen scheitert, weil die in den Maven-Projekten pom.xml aufgelisteten Abhängigkeiten nicht enthalten sind. Unten ist mein Experiment

Ordner-/Projektstruktur

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

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

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

// 
// 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

<?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/Projekt/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

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); 
    } 
} 

Beim Bau "Projekt", erhalte ich die folgende Ausgabe:

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 

Also, was ist der einfachste Weg, um das Maven Teilprojekt „bauen als normal“, als Teilprojekt des Gradle Stammprojektes zu machen, ohne es tatsächlich zu einem Gradle Projekt umwandeln zu müssen?

+0

Das könnte helfen, obwohl es nicht so aussieht, als wäre es aktiv gepflegt: https://github.com/uklance/gradle-maven-share (Genommen von hier: https://stackoverflow.com/questions/40352951/include-gradle-module-to-maven-project) –

+1

Ich empfehle, das Maven-Projekt zu Gradle zu migrieren ... und das ist es ... Was ist Das Problem hier? – khmarbaise

+1

Warum wollen Sie so etwas :(tun wollen? – LazerBanana

Antwort

0

Wenn Sie mvn install auf dem Maven-Projekt genannt, könnten Sie dann

repositories { 
    mavenLocal() 
} 

im gradle Projekt verwenden, um auf das Glas über Gruppe/Artefakt/Version abhängen. Mit Gradle's maven dependency integration erhalten Sie dann alle transitiven Abhängigkeiten vom pom

+0

endete Berufung auf 'mvn install' auf dem Maven Projekt als Schritt Build-Prozess des Stammprojektes. – gromit190

+0

Wenn Sie klug sind, könnten Sie konfigurieren' src/main/java', 'src/main/resources' und' pom.xml' als [task inputs] (https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/TaskInputs.html) und konfiguriert die 'jar' und' pom' Dateien unter Maven lokalen Verzeichnis als die [Task-Ausgaben] (https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/TaskOutputs.html) dann würde Gradle nur Maven aufrufen, wenn die Quellen oder 'pom .xml' Änderung –

Verwandte Themen