2017-08-26 7 views
0

J'essaye de créer et exécuter un pot exécutable par gradle. C'est ce que mon gradle actuel ressemble à:Comment créer puis exécuter un fichier exécutable avec des dépendances dans les IDE Intellij, en particulier Android Studio?

task jarTask(type: Jar) { 
    baseName = 'my-main-class' 
    from 'build/classes/main' 
} 

task createJarWithDependencies(type: Jar) { 
    manifest { 
     attributes 'Implementation-Title': 'Sample Jar', 
        'Implementation-Version': 1, 
       'Main-Class':'com.example.MyMainClass' 
    } 
    baseName = "my-main-class-with-dependencies" 
    from { 
     configurations.compile.collect { 
      it.isDirectory() ? it : zipTree(it) 
     } 
    } 
    with jarTask 
} 

configurations { 
    jarConfiguration 
} 

artifacts { 
    jarConfiguration jarTask 
} 

// This is the task that I call with ./gradlew to execute my jar 
task runMyJar(type: JavaExec) { 
    classpath files('build/libs/my-main-class-with-dependencies.jar') 
    main 'com.example.MyMainClass' 
    args = ["param1","param2"] 
    outputs.upToDateWhen { false } 
} 

runMyJar.dependsOn(createJarWithDependencies, build) 

je suis arrivé ces approche à partir des réponses de débordement de pile suivant/références ci-dessous: Android Studio export jar with dependencies Android studio - How to use an executable jar file from gradle

Cependant quand je lance ./gradlew clean runMyJar (ou même juste ./gradlew runMyJar, je obtenez le message d'erreur suivant:

Error: Could not find or load main class com.example.MyMainClass 

Quelqu'un peut-il indiquer la raison pour laquelle mon fichier exécutable ne trouve pas la méthode principale dans ma classe? Y a-t-il quelque chose qui me manque?

+0

Pouvez-vous ajouter votre classe principale? –

+0

Copie possible de l'attribut [Gradle-no main manifest] (https://stackoverflow.com/questions/32567167/gradle-no-main-manifest-attribute) – jrtapsell

+0

Pas exactement une réponse à votre question, mais regardez https://docs.gradle.org/current/userguide/application_plugin.html –

Répondre

0

Depuis que je ne l'ai pas eu beaucoup de chance avec cette solution, j'ai réussi à contourner ce problème en procédant comme suit à la place:

task deleteJar(type: Delete) { 
    delete 'libs/my-main-class.jar' 
} 

task createJar(type: Copy) { 
    from('build/intermediates/bundles/debug/') 
    into('libs/') 
    include('classes.jar') 
    rename('classes.jar', 'my-main-class.jar') 
} 

// This is the task that I call with ./gradlew to execute my jar 
task runMyJar(type: JavaExec) { 
    classpath files('libs/my-main-class.jar') 
    classpath files('libs/common-util.jar') 
    main 'com.example.MyMainClass' 
    args = ["param1","param2"] 
    outputs.upToDateWhen { false } 
} 

createJar.dependsOn(deleteJar, build) 
runMyJar.dependsOn(createJar, build) 

Ce n'est pas la solution que je veux bien, puisque cette approche doesn Ne tirez pas les dépendances des autres modules référencés par ce module, ce que j'essayais de résoudre. Pour ce faire, je fais copier/coller cette même approche sur ces "autres" modules et générer une lib pour ce module, puis copier cette lib dans le dossier libs de ce module. OU Je peux déplacer ces codes dépendants dans ce même module, donc je n'ai pas besoin de le faire. Pour une application simple qui n'est pas trop mauvaise (ce qui, heureusement, est ma situation), mais pour une application complexe, je ne sais pas trop comment faire.

En tant que référence ajoutée est ici ma section dépendances:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile project(':common-util') 
    // common-util is an Android module, which references other Android 
    // methods such as Log.d, android.util class methods, etc. 
} 

Soit dit en passant, j'utilise Android studio IntelliJ IDE pour cette (qui était la motivation originale de mon post). Mon espoir était de ne pas avoir à créer des fichiers séparés à partir d'autres modules pour l'inclure dans ce module, mais de le faire en une fois ...