Comment compiler un seul fichier java avec gradle?


(MISE À JOUR : Merci aux commentaires de Peter N ci-dessous.)

J'ai un paquet java avec plusieurs classes et donc des fichiers en son sein. Cependant, je veux seulement compiler un de ces fichiers initialement afin que je puisse ensuite l'utiliser pour mettre à jour les autres classes du package. C'est une usine pour les autres classes et par conséquent dépend d'eux - c'est-à-dire. il a des références.

J'ai essayé d'utiliser une tâche JavaCompile gradle pour ce faire. En conséquence, j'ai lisez la documentation de JavaCompile et tentez de rechercher des exemples, mais il semble qu'il y en ait très peu. J'ai même posté sur les forums gradle , mais lent jusqu'à présent.

Je suis capable de faire ce qui est requis facilement avec un script ant en utilisant la tâche ant javac. Mais j'aimerais le faire en gradle (et sans utiliser la fourmi.méthode javac-si je dois le faire, je vais simplement utiliser ant).

J'ai créé un exemple de cas avec seulement deux fichiers source pour deux classes dans l'un paquet.

Les deux fichiers sont dans un paquet appelé some.pkg et nous avons donc la structure de répertoire suivante:

  • .\construire.gradle
  • .\src \ main \ java \ certains \ pkg \ ClassOne.java
  • .\src\main\java\un\pkg\ClassTwo.java

ClassOne:

package some.pkg;

import some.pkg.*;

public class ClassOne {
    public void doStuff() {
    }
}

ClassTwo:

package some.pkg;

import some.pkg.*;

public class ClassTwo {
    public void ClassTwo() {
        ClassOne cone = new ClassOne();
        cone.doStuff();
    }
}

Comme vous pouvez le voir, ClassTwo (notre classe que nous voulons compiler de manière autonome) dépend de ClassOne.

Le script ant est un cas simple de:

<project>
    <property name="build.dir"     value="build"/>
    <property name="lib.dir"     value="lib"/>
    <property name="src.dir"     value="src/main/java"/>
    <target name="generate" >
        <mkdir dir="${build.dir}"/>
        <javac source="1.6" target="1.6" srcdir="${src.dir}" destdir="${build.dir}" 
               debug="true" includeantruntime="false"
               includes="some/pkg/ClassTwo.java">
        </javac>
    </target>
</project>

Mais dans gradle, je continue d'avoir un problème où javac (ou JavaCompile task) ne peut pas trouver ClassOne. C'est comme si le sourcedir ne pointait pas où il devrait - et en effet comme si j'exécutais simplement javac sur la ligne de commande. Je pensais que la propriété "source" de la tâche gradle 'JavaCompile' fonctionnait comme la propriété ant 'srcdir', mais cela ne semble pas être le cas. Voici donc le script gradle que j'essaie actuellement:

apply plugin: 'java'

task compileOne (type: JavaCompile) {
    source = sourceSets.main.java.srcDirs
    include 'some/pkg/ClassTwo.java'
    classpath = sourceSets.main.compileClasspath
    destinationDir = sourceSets.main.output.classesDir
}

, Mais il en résulte:

C:\test\>gradle generate
:generate
C:\test\src\main\java\some\pkg\ClassTwo.java:7: cannot find symbol
symbol  : class ClassOne
location: class some.pkg.ClassTwo
                ClassOne cone = new ClassOne();
                ^
C:\test\src\main\java\some\pkg\ClassTwo.java:7: cannot find symbol
symbol  : class ClassOne
location: class some.pkg.ClassTwo
                ClassOne cone = new ClassOne();
                                    ^
2 errors
:generate FAILED

Alors, comment puis-je obtenir un ant javac équivalent en gradle?

ant javac semble avoir l'intelligence d'aller compiler toutes les autres classes connexes, mais je suppose que pour gradle JavaCompile, je devrai configurer un sourceSet pour le faire.. pas sûr..

Merci!

Author: I Stevenson, 2013-10-16

1 answers

Merci à la discussion avec @PeterNiederwieser sur le message original dans les commentaires, je vais fournir la réponse ici pour l'exhaustivité.

Pour avoir la fonction gradle JavaCompile d'une manière très similaire à ant javac, vous devez fournir l'option sourcepath du compilateur via la propriété options.compilerArgs. Par conséquent, le script gradle qui fonctionne maintenant est le suivant:

apply plugin: 'java'

task compileOne (type: JavaCompile) {
    source = sourceSets.main.java.srcDirs
    include 'some/pkg/ClassTwo.java'
    classpath = sourceSets.main.compileClasspath
    destinationDir = sourceSets.main.output.classesDir
}

compileOne.options.compilerArgs = ["-sourcepath", "$projectDir/src/main/java"]

Notez spécifiquement la dernière ligne (la seule différence) qui permet à tout de fonctionner. Le résultat de ce qui est qu'il compilez en fait ClassOne et ClassTwo au moment de la construction - plutôt que de tenter uniquement le seul fichier explicite que vous avez spécifié. Toutes les autres classes (qui ne sont pas requises) restent non compilées - comme confirmé en regardant dans le répertoire de construction.

Merci Pierre!

 21
Author: I Stevenson, 2013-10-17 05:22:12