Ich habe ein kleines Set Minilibraries für meinen internen Gebrauch geschrieben. Dies wird mit Maven erstellt. Die Bibliotheken sind auf "reguläres" Java, GWT und Android ausgerichtet. Einige von ihnen sind in Java 8 geschrieben, weil ich nicht die Absicht hatte, sie auf GWT oder Android auszuführen, daher sind die anderen Bibliotheken in altem Java 6 geschrieben, um diese beiden zu unterstützen. Ich habe einen Plan für die vollständige Migration meiner Bibliotheken nach Java 8 (in Bezug auf die Sprachfunktionen), und es ist mir gelungen, neu geschriebene Java 8-Bibliotheken auf dem noch nicht veröffentlichten GWT 2.8.0 auszuführen. Allerdings kann ich die neu geschriebenen Java-8-Bibliotheken nicht für Android-Anwendungen kompilieren. Das Problem ist, dass Retrolambda (das retrolambda-maven-plugin
-Plugin) in der Lage ist, nur die aktuellen Maven-Modulklassen zu verarbeiten und die Abhängigkeitsklassen vollständig zu ignorieren. Daher bricht die android-maven-plugin
den Zielanwendungsaufbau mit:
Das retrolambda-maven-plugin
ist wie folgt konfiguriert:
Ist es möglich, das Retrolambda-Plugin so zu konfigurieren, dass auch die Bibliotheksklassen und alle Abhängigkeiten verarbeitet werden? Oder vielleicht könnte ich nur ein anderes Bytecode-Verarbeitungstool verwenden?
UPDATE # 1
Ich glaube, ich liege falsch daran, dass die Retrolambda scheitert. Ich habe herausgefunden, dass android-maven-plugin
dafür verantwortlich gemacht werden kann, weil es die nicht instrumentierten JAR-Dateien direkt aus dem Maven-Repository auswählt und nicht aus dem target
-Verzeichnis. Das Aktivieren der ausführlichen Protokollierung hat diesen Pseudocode-Befehl entdeckt, der von android-maven-plugin
:
Meine Idee ist, das maven-dependency-plugin
Plugin auszuführen, um diese drei Artefakte in das $BUILD_DIRECTORY/classes
Verzeichnis zu bekommen, damit das retrolambda-maven-plugin
Instrument die Abhängigkeiten bekommt. Sagen wir:
SCHRITT 1: Kopieren Sie die Abhängigkeiten in das Zielverzeichnis
%Vor%
SCHRITT 2: Instrumentieren Sie die kopierten Abhängigkeiten mit RetroLambda
Rufen Sie retrolambda-maven-plugin
SCHRITT 3: Kompiliere die DEX-Datei
Aufrufen von android-maven-plugin
mit Ausnahme der Abhängigkeiten, die in das Zielverzeichnis kopiert wurden, da sie sich alle im Zielverzeichnis befinden
Aber das scheitert auch, weil ich keine Möglichkeit finde, Artefakte davon auszuschließen, mit dem android-maven-plugin
DEX gemacht zu werden.
Wie kann ich verhindern, dass die Artefakte aus dem Repository abgerufen werden, in dem sie im nicht instrumentierten Zustand gespeichert sind?
Meine Plugins Konfiguration:
UPDATE # 2
Das Simpligility-Team hat Android Maven Plugin 4.4.1 mit dem unten beschriebenen Szenario veröffentlicht. Weitere Informationen finden Sie unter changelog .
%Vor%Beispiel-Szenario finden Sie unter Ссылка
Vier Monate später, nachdem ich Zeit für die Untersuchung hatte, habe ich es endlich geschafft. Das Wichtigste an der Lösung ist das Patchen von android-maven-plugin
. Ich habe das ursprüngliche Plugin bei GitHub gegabelt und ein paar Konfigurationsfilter-Optionen hinzugefügt, die es ermöglichen, Artefakte nach Gruppen-IDs, Artefakt-IDs und ihren jeweiligen Versionen ein- oder auszuschließen. Dies ist sehr wichtig, um retrolambda-maven-plugin
zu konfigurieren. Der gesamte Workflow entspricht im Wesentlichen dem, was ich in der Frage notiert habe. Hier ist es:
maven-compiler-plugin
Aktivieren Sie die Unterstützung für Java 8-Sprachfunktionen. Optional, da das Hauptziel die Verarbeitung von Abhängigkeiten von Java 8 ist. maven-dependency-plugin
Entpacke ALLE Java 8 Abhängigkeiten zum aktuellen Projekt Build Zielverzeichnis für die weitere Verarbeitung. retrolambda-maven-plugin
Verarbeitet alle erhaltenen Klassendateien mit dem RetroLambda-Plugin. android-maven-plugin
Kompiliere die DEX- und APK-Dateien mit der Verzweigung des ursprünglichen android-maven-plugin
. Installieren der Gabel:
%Vor% Fertig. Als nächstes registrieren Sie die Verzweigung in Ihrem pom.xml
und konfigurieren Sie die Build-Plugins:
Es sollte funktionieren.
Aktualisieren
Vor kurzem habe ich die Gabel für das Proguard Maven-Mojo geflickt.
Update 2
Der android-maven-plugin
-Repository-Besitzer hat meine Commits verschmolzen , sodass die Artefaktfilterung geplant ist die nächste Version.
Tags und Links android maven java-8 android-maven-plugin retrolambda