<! - TODO: Seien Sie vorsichtig, wenn die verschiedenen Links und Notationen für 2018 sind. Achten Sie besonders auf den Twitter-Link! !! -> Das Präsentationsmaterial für die Titelsitzung von JJUG CCC 2019 Spring wurde auf Qiita (Twitter: # ccc_a2 veröffentlicht. //twitter.com/search? q =% 23ccc_a2)).
<! - Ersetzen Sie durch das Lautsprecherbild von Speakers deck-> <! - TODO: Linkziel muss korrigiert werden! !! ->
Der Inhalt ist fast der gleiche wie auf der obigen Folie. Bitte sehen Sie ihn leicht lesbar.
<! - TODO: Behalte den Rücken der Zeitreihe->
Unsere Firma M3 Co., Ltd. wurde im Jahr 2000 gegründet (J2SE
, die Ära um Java 2).
Ich benutze Java seit den Tagen, als Maven, Gradle und Ivy noch nicht da waren.
Wenn Sie "Git Clone" ausführen, lautet die folgende Datei ...
lib/app/hibernate-validator-4.3.0.Final.jar
lib/app/aws-java-sdk-core-1.10.27.jar
lib/app/aws-java-sdk-s3-1.10.27.jar
lib/app/generator-runtime-0.3.0-20050901.1909.jar
lib/app/xalan.jar
lib/app/crimson.jar
...Geht endlos weiter...
Infolge der zunehmenden Anzahl von Bibliotheken, die im Laufe der Geschichte verwendet wurden, rollten 182 ".jar".
.jar
direkt verwaltenIch war mit einem solchen Prozess in einem Wartungszustand:
Beispiel: Ich möchte die Version von aws-java-sdk
aktualisieren, um die neuen Funktionen nutzen zu können
Das aws-java-sdk-System hängt indirekt von mehreren Bibliotheken ab
Ich weiß nicht, wie ich 182 .jar
s aktualisieren soll
Geben Sie die Verwendung neuer AWS-Funktionen auf: cry:
Ich benutze kein Glas, also möchte ich es löschen
Vielleicht hängt eines der Gläser davon ab ...
Unnötiges Glas kann nicht gereinigt werden
Um JVM-Versions-Upgrades und Gegenmaßnahmen gegen Sicherheitslücken zu verhindern: cry:
Ich möchte Informationen zu Sicherheitslücken überprüfen
Überprüfen Sie 182 .jar
s regelmäßig auf Informationen zu Sicherheitslücken
Robust und begrenzt
Ich neige dazu, es in Ruhe zu lassen
Gradle, Maven usw. können mit dem OWASP-Plugin "Dependency-Check" automatisiert werden ...
Abgesehen von diesem System wurden Maven und Gradle bereits installiert, aber ...
Unter diesen Umständen kann es weltweit Fälle geben, in denen Paketverwaltungstools nicht enthalten sind.
Aber wie implementiert man es in ein bestehendes Projekt ...?
――Was tun mit den Punkten, die die Arbeitsbelastung erhöhen? ――Was sind die Nebenwirkungen und Auswirkungen des Hinzufügens?
→ Fahren Sie mit dem nächsten Kapitel fort
<! - =================================== # Abschnitt: Strategischer Teil (Gradle) == ================================= ->
~ Historische Systemverbesserung __Mögliche __Bereichsdefinition ~
Die Nachrüstung bestehender Systeme birgt eine Reihe von Herausforderungen:
――Ist es gut, dass sich das Glas vor und nach der Einführung des Tools ändert? --Was tun mit schwer zu beschaffenden Gläsern oder Gläsern, die nicht zur Mitte passen?
Es ist besser, eine Richtlinie zu haben, damit Sie nicht von Problemen beeinflusst werden.
Konzentriert sich darauf, von Paketverwaltungstools zu profitieren Es wurde eine Situation geschaffen, in der Sie sich kleinen und bedeutungsvollen Herausforderungen stellen können.
: + 1: Vorteile:
: -1: Nachteile:
--Ant bleibt
Identifizieren Sie die wahren "Probleme" und "Verdienste um Änderungen"
Betrachten Sie den "notwendigen und ausreichenden Mindestumfang" dafür.
Erreichen Sie das Ziel mit "kleiner Herausforderung"
Anstelle von "Weil es ein Vermächtnis ist, musst du alles töten !!!" Verbesserungen beim Befolgen der vorhandenen guten Punkte und Punkte, die nicht geändert werden müssen.
~ Spezifische Maßnahmen zur Bewältigung verschiedener Probleme, die tendenziell nachgerüstet werden ~
Gradle or Maven
Gradle wird für Anwendungen wie diese empfohlen:
Einführung von Gradle unter Verwendung des vorhandenen Build-Systems Ich möchte die folgenden Dateien mit Gradle in das angegebene Verzeichnis kopieren:
--Jar, das von der Kompilierungszeit und der Laufzeit abhängt
Ich möchte auch automatisch die .classpath
-Datei (später beschrieben) </ small> pflegen.
Überraschend einfach:
def compileJarCopyTo = 'development/lib/app'
task downloadJars() {
doLast {
//Am Kopierziel*.Löschen Sie das Glas
delete fileTree(dir: compileJarCopyTo, include: '*.jar')
//eine Kopie machen
copy {
from configurations.compile
into compileJarCopyTo
}
}
}
copy
task
Praktisch, um das zu kopierende Glas anzugeben und einzuschließen, auszuschließen usw.:
copy {
// testCompile =Kopieren Sie die abhängigen Gläser mit Test
from configurations.testCompile
into testCompileJarCopyTo
//Ignorieren Sie Gläser, die dem angegebenen Muster entsprechen
exclude 'jmockit-*.jar'
}
Um das Quellglas zu kopieren, schreiben Sie Code, um diese Schutzbrillen zu manipulieren:
import org.gradle.jvm.JvmLibrary
import org.gradle.language.base.artifact.SourcesArtifact
import org.gradle.api.artifacts.query.ArtifactResolutionQuery
import org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier
(org.gradle.internal
ist ebenfalls erschienen ...) </ small>
→ Lesen Sie den Code für Gradle 2.x des Vorgängers und die Gradle 5.x-kompatible Version
Quell-JAR-Dateien in Verzeichnis kopieren (Qiita) ) Veröffentlicht in
Eine Konfigurationsdatei, mit der die IDE Jars und Quellcode laden kann. Ursprünglich für Eclipse, unterstützt es auch InteliJ IDEA.
Ich möchte diese Datei auch mit Gradle pflegen.
Es kann einfach durch Anwenden von Gradles "Eclipse" -Plugin generiert werden ...
.classpath
Absolutes PfadproblemDer vom Plugin generierte Pfad in .classpath
ist ein absoluter Pfad.
Dies ist unpraktisch, da es sich um einen umgebungsabhängigen Pfad handelt und nicht auf Git freigegeben werden kann.
Lösung:
Wenn Sie es mit dem Hook des Plugins erweitern, wie in Referenzseite anstelle von "pathVariables" gezeigt. ": ProjectDir" des "Eclipse" -Plugins gut:
eclipse.classpath.file {
whenMerged { classpath ->
classpath.entries.findAll { entry -> entry.kind == 'lib' }.each {
it.path = it.path.replaceFirst("${projectDir.absolutePath}/", '')
it.exported = false
}
}
}
WhenMerged
in eclipse.classpath.file
Sie können den Inhalt der .classpath
-Datei mit whenMerged
frei steuern
Zum Beispiel:
classpath.entries.sort
steuert die Reihenfolge von .classpath
classpath.getEntries (). removeAll {return (bedingter Ausdruck)}
Manuelle Verwaltungsglas-Dateinamen und von Gradle abgeleitete Gläser stimmen häufig nicht überein. Zum Beispiel:
crimson.jar
--Gradle Download Ergebnis: crimson-1.1.3.jar
Beim Verweisen mit einem festen Dateinamen tritt ein Problem auf. Insbesondere gibt es Folgendes:
classpath
(> = 6), benutze *
Platzhalter wie Shell*
etwas anders ist.Letzteres ist ein Ärger, aber es ist eine vorübergehende Anstrengung, daher ist es besser, langfristig damit umzugehen.
<! - =================================== # Abschnitt: Strategischer Teil (Jar Management) = =================================== ->
~ Techniken für den Umgang mit JAR-Dateien, die aus der Vergangenheit stammen ~
<! ---- Das im All-in-One-Glas enthaltene Glas ist abgedeckt->
SNAPSHOT
VersionLassen Sie die Diskrepanz nicht, sondern überprüfen Sie nur die spezifischen Unterschiede:
Ich habe vor und nach der Gradleisierung einen SHA-1-Hash der JAR-Datei ausgegeben. Wir haben uns die spezifischen Unterschiede für Gläser mit nicht übereinstimmenden Hashes angesehen.
Die JAR-Datei ist eine Zip-Datei. Nach dem Entpacken werden die folgenden Dateien angezeigt:
.class
Datei (Java Byte Code)Mit Ausnahme von ".class" können die meisten Textvergleichstools zum Vergleich verwendet werden.
Beispiel, wenn es einen Unterschied in "META-INF / MANIFEST.MF" von "Lucene-Analysatoren-2.4.0" gibt: </ small>
8c8
< Implementation-Version: 2.4.0 701827 - 2008-10-05 16:46:27
> Implementation-Version: 2.4.0 701827 - 2008-10-05 16:44:47
Die .class
-Datei ist eine Java-Bytecode-Binärdatei.
Durch Konvertieren in eine Textdarstellung mit "javap -c" im JDK Es wird möglich, mit dem Textvergleichstool zu vergleichen.
Beispiel, wenn es einen Unterschied in guice-servlet-1.0.jar
gibt:
2c2
< final class com.google.inject.servlet.ServletScopes$1 implements com.google.inject.Scope {
> class com.google.inject.servlet.ServletScopes$1 implements com.google.inject.Scope {
(ersetzt durch jar mit final
hinzugefügt) </ small>
Andere Maßnahmen als die Aussetzung der Nutzung der Bibliothek:
.java
-Datei der Zielbibliothek direkt
-: -1: Da die Quelle direkt verwendet wird, treten in der Regel Originalmodifikationen und eine enge Kopplung auf.
-: -1: Abhängig von der Lizenz liegt ein Problem vorNicht nur für nicht abrufbare Gläser, sondern auch für die Verwaltung interner Bibliotheken usw. Es ist praktisch, ein privates Repository zu haben.
Übliche Bauweise:
file: //
Mit Gradle können Sie dies einfach tun, indem Sie:
repositories {
maven {
url 'http://central.maven.org/maven2/'
} // mavenCentral()Ich wage es nicht, die Kurznotation zu verwenden(Siehe unten)
maven {
url "http://URL des privaten Repositorys"
}
}
<! - TODO: Diese Beschreibung ist abhängig von den Annahmen auf Leserebene möglicherweise nicht erforderlich ... Aber sollte ich so etwas wie Gradle für Leute schreiben, die Maven nicht kennen? ->
Schreiben Sie die Metadaten im XML-Format (pom.xml
) von Maven und laden Sie sie mit dem jar hoch.
Auf den ersten Blick mag es unangenehm erscheinen, aber es ist einfach, wenn Sie sich auf diesen Zweck konzentrieren:
<project>
<modelVersion>4.0.0</modelVersion>
<!--Identifikationsinformationen dieses Glases selbst-->
<groupId>com.m3</groupId> <artifactId>m3generator</artifactId>
<version>1.0.0</version>
<!--Informationen zu dem Glas, von dem dieses Glas abhängt-->
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
...
Es sieht praktisch aus, da Artifactory automatisch ein POM generiert ...
<Abhängigkeiten>
ist oft leer oder falsch
Ich kann keine Informationen über die abhängigen Bibliotheken des hochgeladenen JARs erhalten
Die Vorteile des Abhängigkeitsmanagements mit Paketverwaltungstools gehen verloren
Lassen Sie uns "<Abhängigkeiten>" richtig schreiben, ohne es auf die automatische Generierung zu werfen.
Wenn es Bibliotheken mit demselben Namen gibt, die jedoch nicht übereinstimmen (mit Unterschieden) Sie sollten explizit steuern, welches geladen wird:
repositories {
maven { // Maven central
url 'http://central.maven.org/maven2/'
content {
excludeGroup 'com.sun.jmx' //Bekomme diese Gruppe nicht von hier
excludeModule 'jdom', 'jdom' //Erhalten Sie diese Bibliothek nicht von hier
}
//MavenCentral, um die obige Beschreibung vorzunehmen()Ich verwende nicht die abgekürzte Notation wie
}
Next Step
Was Sie besonders tun möchten, wenn Sie ein Paketverwaltungstool hinzufügen:
--Versionskollisionserkennung
Eine ausführlichere Erklärung zu den JJUG 2018 Spring-Folien:
--Titel: Wie man einen Kompromiss zwischen Spring Boot und allgemeinen Bibliotheken eingeht
Diesmal der Prozess, bei dem das Paketverwaltungstool installiert wurde:
Selbst in einer Situation, in der Sie denken können, dass die Dunkelheit so tief ist, dass Sie sie nicht berühren können __ Stellen Sie den geeigneten Umfang ein und realisieren Sie mit Technologie __, um vorwärts zu kommen.