execution example - Gradle pour exécuter la classe Java(sans modifier build.gradle)





jar application (4)


Utilisez JavaExec . À titre d'exemple, mettez ce qui suit dans build.gradle

task execute(type:JavaExec) {
   main = mainClass
   classpath = sourceSets.main.runtimeClasspath
}

Pour exécuter gradle -PmainClass=Boo execute . Vous obtenez

$ gradle -PmainClass=Boo execute
:compileJava
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes
:execute
I am BOO!

mainClass est une propriété transmise dynamiquement à la ligne de commande. classpath est configuré pour récupérer les dernières classes.

Si vous ne transmettez pas la propriété mainClass , cela échoue comme prévu.

$ gradle execute

FAILURE: Build failed with an exception.

* Where:
Build file 'xxxx/build.gradle' line: 4

* What went wrong:
A problem occurred evaluating root project 'Foo'.
> Could not find property 'mainClass' on task ':execute'.

MISE À JOUR à partir des commentaires:

Il n'y a pas mvn exec:java équivalent dans gradle, vous devez soit appliquer le plugin d'application, soit avoir une tâche JavaExec.

Il y a un simple plugin Eclipse pour lancer Gradle, qui utilise simplement la ligne de commande pour lancer gradle.

Quel est l'analogue de gradle pour maven compile et exécutez mvn compile exec:java -Dexec.mainClass=example.Example

De cette façon, n'importe quel projet avec gradle.build pourrait être exécuté.

MISE À JOUR: Il y avait une question similaire Quel est l'équivalent graduel du plugin exec de maven pour l'exécution d'applications Java? demandé avant, mais la solution a suggéré de modifier chaque projet build.gradle

package runclass;

public class RunClass {
    public static void main(String[] args) {
        System.out.println("app is running!");
    }
}

Ensuite, exécutez gradle run -DmainClass=runclass.RunClass

:run FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> No main class specified   



Vous avez juste besoin d'utiliser le plugin Gradle Application :

apply plugin:'application'
mainClassName = "org.gradle.sample.Main"

Et puis tout simplement gradle run .

Comme Teresa le fait remarquer, vous pouvez également configurer mainClassName comme une propriété système et l'exécuter avec un argument de ligne de commande.




Expansion sur la réponse de First Zero, je suppose que vous voulez quelque chose où vous pouvez également exécuter la gradle build sans erreurs.

Les deux gradle build et gradle -PmainClass=foo runApp fonctionnent avec ceci:

task runApp(type:JavaExec) {
    classpath = sourceSets.main.runtimeClasspath

    main = project.hasProperty("mainClass") ? project.getProperty("mainClass") : "package.MyDefaultMain"
}

où vous définissez votre classe principale par défaut.




Java a des classes imbriquées statiques, mais il semble que vous cherchiez une classe statique de haut niveau. Java n'a aucun moyen de créer une classe statique de niveau supérieur, mais vous pouvez simuler une classe statique comme celle-ci:

  • Déclarez votre classe final - Empêche l'extension de la classe car étendre une classe statique n'a aucun sens
  • Rendez le constructeur private - Empêche l'instanciation par le code client car cela n'a aucun sens d'instancier une classe statique
  • Rendre tous les membres et fonctions de la classe static - Puisque la classe ne peut pas être instanciée, aucune méthode d'instance ne peut être appelée ou des champs d'instance peuvent être accédés
  • Notez que le compilateur ne vous empêchera pas de déclarer un membre d'instance (non statique). Le problème ne s'affichera que si vous tentez d'appeler le membre de l'instance

Exemple simple par suggestion d'en haut:

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

À quoi servent les classes statiques? Une bonne utilisation d'une classe statique consiste à définir des classes uniques, utilitaires et / ou de bibliothèques où l'instanciation n'aurait pas de sens. Un bon exemple est la classe Math qui contient des constantes mathématiques telles que PI et E et fournit simplement des calculs mathématiques. Exiger l'instanciation dans un tel cas serait inutile et déroutant. Voir la classe Math de Java . Notez qu'il est final et que tous ses membres sont statiques. Si Java permettait aux classes de niveau supérieur d'être déclarées statiques, la classe Math serait en effet statique.





java gradle execution