Nach der Verwendung von Android Studio 3 können Java-Anwendungsabhängigkeiten nicht mehr aufgelöst werden. Was tun?

Symptome

Nach dem Wechsel zu "com.android.tools.build: gradle: 3.0.1" zur Unterstützung von Android Studio 3.x konnte die Abhängigkeit der reinen Java-Anwendung, die von Application of Run Configuration ausgeführt werden konnte, nicht aufgelöst werden. Das heißt, "NoClassDefFoundError" wird angezeigt.

Kurz gesagt, es gab eine solche Java-Anwendung in einem Modul. スクリーンショット 2017-12-09 20.44.08.png

Aktion (Best Practice [hier](https://qiita.com/KoheiKanagu/items/0836d11c608d9394a36e# und Best Practice))

** Hinweis: Dies hört nicht am Haltepunkt auf. Wie Sie aufhören können, wird später beschrieben **

Stellen Sie es auf diese Weise so ein, dass es mit "gradle run" ausgeführt werden kann. Im Bild lautet der Modulname lib. :yourModuleName:run

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

Fügen Sie build.gradle des Zielmoduls Folgendes hinzu.

build.gradle


apply plugin: 'application'

mainClassName = "your.main.class.myClass"

Kurz gesagt, ähnelt es dem Problem, dass keine Ressource erhalten werden konnte? Bis Android Studio ein ausführbares Jar mit Ressourcen aus einem Java Library-Modul generiert

Ausführungsmethode, die auch an einem Haltepunkt stoppt

** Hinweis: Es ist nicht gut, weil die Gradle-Aufgabe nach einer Weile nach einer Pause stirbt ... **

Angenommen, Sie haben ein Java-Modul namens "lib", Sie haben "myClass.java" und Sie verweisen auf 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();
    }
}

Fügen Sie build.gradle eine JavaExec-Aufgabe mit einem geeigneten Namen hinzu. Wenn Sie den Namen wie "executeHote" oder "executePiyo" ändern und jede Hauptleitung festlegen, können Sie Module verarbeiten, für die Sie mehrere Hauptleitungen erstellen möchten.

build.gradle


apply plugin: 'application'

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.google.code.gson:gson:2.8.2'
}

mainClassName = "" //Es scheint nicht sinnvoll zu sein, aber ohne es wird der gesamte Projektaufbau nicht funktionieren

task executeMyClass(type: JavaExec) {
    main = "com.example.lib.myClass"
    classpath = sourceSets.main.runtimeClasspath
}

Remote hinzufügen von Neue Konfiguration hinzufügen. Name ist angemessen. Suchquellen unter Verwendung des Klassenpfads des Moduls: kann als <Gesamtprojekt> bleiben

Fügen Sie "Run Gradle Task" von Vor dem Start hinzu. Grade-Projekt ist das Projekt, das Sie ausführen möchten, diesmal lib. Verwenden Sie für Gespräche : lib: executeMyClass --debug-jvm. (--Debug-jvm wartet darauf, dass der Debugger angehängt wird.) スクリーンショット 2017-12-10 22.16.50.png Zusammenfassend sieht es so aus. スクリーンショット 2017-12-10 22.12.58.png

Lauf

Wenn das Debuggen ausgeführt wird, wird "executeMyClass" gemäß "Vor dem Start" ausgeführt. Dies endet jedoch nicht, da auf einen Anhang vom Debugger gewartet wird.

Also hör auf. Kurz gesagt, klicken Sie auf die ganz rechts im Bild. スクリーンショット 2017-12-10 22.25.20.png Halten Sie dann am Haltepunkt an.

JavaExec Gradle to execute Java class (without modifying build.gradle)

Das Gefühl, dass es ausgeführt wurde, weil es gestoppt wurde, war erstaunlich und es wurde problematischer als in Android Studio 2.x, aber ~~ Es funktioniert vorerst, also ist es gut. ~~ Es bewegt sich nicht.

~~ Und Best Practice ~~

Erstellen Sie task executeMyClass in build.gradle auf die gleiche Weise wie im vorherigen Kapitel. Fügen Sie Remote von Add New Configuration hinzu, aber stellen Sie den Namen entsprechend ein und lassen Sie alles andere standardmäßig in Ordnung.

Führen Sie sh selbstverständlich aus.

executeMyClass.sh


./gradlew :lib:executeMyClass --debug-jvm

Dann bleibt es bei AUSFÜHREN gestoppt.

Wenn Sie die soeben in Android Studio hinzugefügte Fernbedienung mit Debug ausführen, können Sie sie anhängen. Herzliche Glückwünsche. Der Fehler wird im Terminal angezeigt, sodass Sie nicht klicken können, um zur abgelegten Klasse zu springen.

Ich habe einen Weg gefunden, dies genauso zu tun wie in der Android Studio 2.x-Ära. Die beste Vorgehensweise ist also ** hier **

Beiseite

Es ist viel Arbeit im Vergleich zu Android Studio 2.x, aber ist es der einzige Weg, um nicht in der Zeit zurückgelassen zu werden ...? Es kann falsch sein, eine Java-Anwendung in Android Studio auszuführen. (Ich dachte, aber wenn das Projekt kein Android-Modul hat, ist es ein zusätzliches Rätsel, dass es über die Anwendungskonfiguration ausgeführt werden kann.) Ich denke, es liegt an der Spezifikationsänderung aufgrund der zunehmenden Implementierung und API in Gradle Plugin 3.x, aber ich verstehe das Problem nicht wirklich ...

Recommended Posts

Nach der Verwendung von Android Studio 3 können Java-Anwendungsabhängigkeiten nicht mehr aufgelöst werden. Was tun?
Ich konnte die Abhängigkeit der Java-Anwendung nach der Verwendung von Android Studio 3 nicht auflösen. Wie gehe ich damit um? Teil 2
WSL2 Ubuntu 20 kann nicht mehr passen, also was tun?
Starten Sie jnlp, das abgelaufen ist und ohne Java Web Start nicht mehr gestartet werden kann
Was benötigen Sie am Ende, um eine Web-App mit Java zu erstellen? Erklären Sie den Mechanismus und was zum Lernen notwendig ist
Nach dem Update auf OSX Catalina kann ich nicht mehr sass
[Für Anfänger] Ruby soll Rubin sein, aber was ist damit?