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?
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) –
Ich empfehle, das Maven-Projekt zu Gradle zu migrieren ... und das ist es ... Was ist Das Problem hier? – khmarbaise
Warum wollen Sie so etwas :(tun wollen? – LazerBanana