Maven: Verwendung von Java 8 Bibliotheken in Anwendungen, die mit RetroLabda-Maven-Plugin und DEX-Ed mit Android-Maven-Plugin ausgestattet sind

8

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:

%Vor%

Das retrolambda-maven-plugin ist wie folgt konfiguriert:

%Vor%

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 :

aufgerufen wurde %Vor%

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

auf

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:

  • org.apache.maven.plugins: maven-dependency-plugin: 2.10
  • net.orfjackal.retrolambda: retrolambda-maven-plugin: 2.0.2
  • com.jayway.maven.plugins.android.generation2: android-maven-plugin: 3.9.0-rc.3

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 Ссылка

    
Lyubomyr Shaydariv 17.05.2015, 11:24
quelle

1 Antwort

5

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:

%Vor%

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.

    
Lyubomyr Shaydariv 10.09.2015, 20:16
quelle