Après être passé à com.android.tools.build: gradle: 3.0.1
pour prendre en charge Android Studio 3.x, la dépendance de l'application Java pure qui pouvait être exécutée à partir de l'application de configuration d'exécution n'a pas pu être résolue.
Autrement dit, «NoClassDefFoundError» s'affiche.
En bref, il y avait une telle application Java dans un module.
** Remarque: cela ne s'arrêtera pas au point d'arrêt. Comment vous pouvez vous arrêter sera décrit plus tard **
De cette façon, définissez-le pour qu'il puisse être exécuté avec gradle run
.
Dans l'image, le nom du module est lib.
:yourModuleName:run
Et ajoutez ce qui suit à build.gradle du module cible.
build.gradle
apply plugin: 'application'
mainClassName = "your.main.class.myClass"
En bref, est-ce similaire au problème que la ressource ne peut être obtenue? Jusqu'à ce qu'Android Studio génère un fichier Jar exécutable contenant des ressources à partir d'un module de bibliothèque Java
** Remarque: ce n'est pas bon car la tâche gradle mourra après un certain temps après une pause ... **
Supposons que vous ayez un module Java appelé lib
, que vous ayez myClass.java
et que vous référencez Gson.
myClass.java
package com.example.lib;
import com.google.gson.GsonBuilder;
public class myClass {
public myClass() {
System.out.println(GsonBuilder.class);
System.out.println("hoge");
}
public static void main(String[] args) throws Exception {
new myClass();
}
}
Ajoutez une tâche JavaExec à build.gradle
avec un nom approprié.
Si vous modifiez le nom tel que ʻexecute Hote ou ʻexecute Piyo
et définissez chaque main, je pense qu'il peut être utilisé pour les modules qui veulent créer plusieurs réseaux.
build.gradle
apply plugin: 'application'
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.google.code.gson:gson:2.8.2'
}
mainClassName = "" //Cela ne semble pas logique, mais sans cela, l'ensemble du projet ne fonctionnera pas
task executeMyClass(type: JavaExec) {
main = "com.example.lib.myClass"
classpath = sourceSets.main.runtimeClasspath
}
Ajouter une télécommande à partir de Ajouter une nouvelle configuration. Le nom est approprié.
Rechercher les sources en utilisant le chemin de classe du module:
peut rester comme <projet entier>
Ajoutez Exécuter la tâche Gradle
depuis Avant le lancement.
Le projet Grade est le projet que vous souhaitez exécuter, cette fois lib.
Pour les discussions, utilisez : lib: executeMyClass --debug-jvm
. (--Debug-jvm
attend que le débogueur se connecte.)
En résumé, ça ressemble à ça.
Quand Run debug est exécuté, ʻexecuteMyClass est exécuté selon
Before launch`.
Mais cela ne s'arrête pas car il attend une pièce jointe du débogueur.
Alors arrêtez. En bref, cliquez sur celui à l'extrême droite de l'image. Puis arrêtez-vous au point d'arrêt.
JavaExec Gradle to execute Java class (without modifying build.gradle)
Le sentiment qu'il a été exécuté parce qu'il a été arrêté était incroyable, et il est devenu plus gênant que dans Android Studio 2.x, mais ~~ Cela fonctionne pour le moment, donc c'est bien. ~~ Il ne bouge pas.
Créez task executeMyClass
dans build.gradle
de la même manière que dans le chapitre précédent.
Ajouter à distance à partir de Ajouter une nouvelle configuration, mais définissez le nom de manière appropriée et laissez tout le reste OK par défaut.
Exécutez sh comme une évidence.
executeMyClass.sh
./gradlew :lib:executeMyClass --debug-jvm
Ensuite, il reste arrêté à EXECUTING.
Si vous exécutez la télécommande que vous venez d'ajouter dans Android Studio avec le débogage ... vous pouvez la joindre. Toutes nos félicitations. L'erreur est affichée dans le terminal, vous ne pouvez donc pas cliquer pour accéder à la classe supprimée.
C'est beaucoup de travail par rapport à Android Studio 2.x, mais est-ce le seul moyen d'éviter d'être laissé pour compte dans le temps ...? Il peut être erroné d'exécuter une application Java dans Android Studio en premier lieu. (J'ai pensé, mais si le projet n'a pas de module Android, c'est un mystère supplémentaire qu'il puisse être exécuté à partir de la configuration de l'application) Je pense que c'est causé par le changement de spécification dû à l'augmentation de l'implémentation et de l'API dans le plugin Gradle 3.x, mais je ne comprends pas vraiment le problème ...
Recommended Posts