2017-01-10 2 views
1

ich ein Java-Projekt, die ich in gradle aufbauen will und die Quelle ist in der folgenden Struktur,gehören ua eine Datei von einem bestimmten Quellordner in Gradle

src 
| 
+-main 
| | 
| +-java 
|  | 
|  +-package 
|  | 
|  +- Utils.java 
|  +- Other.java 
|  +- Files.java 
|  +- Folders.java 
+-awesome 
    | 
    +-java 
     | 
     +-package 
      | 
      +- Utils.java 

Nun würde Ich mag die Dateien erstellen aus dem sourceSet src/main/java aber mit dem Utils.java in src/awesome/java statt aus dem main Quellsatz.

Ich habe folgende Möglichkeiten versucht (erfolglos):

1.e Geben Sie den vollständigen Dateipfad in exclude:

sourceSets { 
    main { 
     java { 
      srcDir "src/awesome/java" 
      exclude "${projectDir}/src/main/java/package/Utils.java" 
     } 
    } 
} 

Output: error: duplicate class package.Utils

den vollständigen Dateipfad wie das Geben Sieht nicht funktioniert im Ausschlussmuster.

2. Mit 2 Java-Verschlüsse:

sourceSets { 
    main { 
     java { 
      exclude "package/Utils.java" 
     } 
     java { 
      srcDir "src/awesome/java" 
     } 
    } 
} 

Aber diese entfernt die Utils.java Klasse von beiden Quellen-Standorte.

Ist es möglich, eine einzelne Quelldatei von einem anderen Ort in Gradle bereitzustellen?

Hinweis: Ich kann die Utils.java Klasse nicht allein kompilieren, da es Abhängigkeiten mit den anderen Klassen hat. (Ich weiß, es ist schlecht, keine Notwendigkeit, es einzureiben).

Auch das Kopieren der Datei in die Position main/java/package ist nicht möglich, da dies das SCM verschmutzen könnte.

Antwort

1

ich Ihnen vorschlagen, eine Aufgabe in die DAG einfügen, die Quellen zu verschmelzen und das fusionierte Ordner

Eg bauen:

sourceSets.main.java { 
    srcDirs = ["$buildDir/mergedSources"] 
} 
task mergeSources(Type:Copy) { 
    from 'src/awesome/java' 
    from 'src/main/java' 
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE // (see https://docs.gradle.org/current/javadoc/org/gradle/api/file/DuplicatesStrategy.html#EXCLUDE) 
    into "$buildDir/mergedSources" 
} 
compileJava.dependsOn mergeSources 

Also copying the file to the main/java/package location is not possible since it could pollute the SCM.

Vorausgesetzt, dass Sie bereits $buildDir von SCM sind ohne dies nicht 'verschmutzen' SCM

+0

Danke ... Das würde sehr gut funktionieren, obwohl ich auch in der Lage war, die erforderliche Datei mit Schließungen auszuschließen, wie in meiner eigenen Antwort erwähnt. Welcher ist Ihrer Meinung nach ein besserer Ansatz? – Codebender

+0

Wenn deins in Ihrer IDE funktioniert, würde ich das verwenden, da es keine Kopie erfordert. Ich habe das Gefühl, dass eclipse/intellij das nicht unterstützen wird, so dass es zu Konflikten mit dem, was grddle baut und was eclipse/intellij gibt –

0

Es sieht so aus, als könnten wir bestimmte Dateien mit den Methoden exclude(Closure) oder exclude(Spec) ausschließen, statt zu übergeben Saiten.

Hier ist, wie ich es erreicht,

sourceSets { 
    main { 
     java { 
      srcDir "src/awesome/java" 
      exclude { fileTreeElement -> 
       fileTreeElement.file.equals("${projectDir}/src/main/java/package/Utils.java" as File) 
      } 
     } 
    } 
} 

diese Weise die Utils.java von ehrfürchtigen Unterordner enthalten und schließt die Utils.java aus dem Haupt Unterordner.

+0

Wenn ich du wäre, würde ich 'src/main/java' dynamisch von' src/subtrahieren awesome/java', so dass Sie 'src/awesome/java' um weitere Dateien erweitern können und diese ohne zusätzliche Konfiguration überschrieben werden (anstelle von hard-coding package/Utils.java) –

Verwandte Themen