Après avoir utilisé Android Studio 3, les dépendances des applications Java ne peuvent plus être résolues, alors que faire à ce sujet

Symptômes

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. スクリーンショット 2017-12-09 20.44.08.png

Action (Meilleures pratiques [ici](https://qiita.com/KoheiKanagu/items/0836d11c608d9394a36e# et meilleures pratiques))

** 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

スクリーンショット 2017-12-09 20.44.23.png

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

Méthode d'exécution qui s'arrête même à un point d'arrêt

** 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.) スクリーンショット 2017-12-10 22.16.50.png En résumé, ça ressemble à ça. スクリーンショット 2017-12-10 22.12.58.png

Courir

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. スクリーンショット 2017-12-10 22.25.20.png 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.

~~ Et les meilleures pratiques ~~

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.

J'ai trouvé un moyen de le faire de la même manière qu'à l'époque d'Android Studio 2.x, donc la vraie meilleure pratique est ** ici **

De côté

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

Après avoir utilisé Android Studio 3, les dépendances des applications Java ne peuvent plus être résolues, alors que faire à ce sujet
Je n'ai pas pu résoudre la dépendance de l'application Java après avoir utilisé Android Studio 3, alors comment y faire face Partie 2
WSL2 Ubuntu 20 ne peut plus apt-get, alors que faire
Démarrez jnlp qui a expiré et ne peut plus être démarré sans utiliser Java Web Start
De quoi avez-vous besoin à la fin pour créer une application Web en utilisant Java? Expliquer le mécanisme et ce qui est nécessaire pour apprendre
Que faire si le journal utilisant JUL n'est plus sorti dans le journal de l'application après le déploiement de l'application Spring Boot sur Tomcat en tant que guerre
Après la mise à jour vers OSX Catalina, je ne peux plus sass
[Pour les débutants] On dit que le rubis est rubis, mais qu'en est-il?