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.
** 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
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
** 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.)
Zusammenfassend sieht es so aus.
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.
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.
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.
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