Eine Geschichte über ein in Java geschriebenes Spring Boot-Projekt, das Kotlin unterstützt

Hintergrund

Die Ingenieure des NOREL-Teams modernisieren die verwendete Technologie, und es gab einen Vortrag, dass "ich ein in Java / Spring Boot in Kotlin geschriebenes System sowieso schreiben möchte", also werde ich mit der Korrespondenz fortfahren, damit es in Kotlin entwickelt werden kann. Ich bin.

Ich sehe oft Artikel wie das Beginnen mit Kotlin (Gradle) von Anfang an, aber ich konnte nicht viele Artikel finden, die Kotlin (Maven) entsprechen, während es in Java geschrieben wurde, also habe ich versucht, damit umzugehen.

Bestehende Umgebung

Grundsätzlich implementiert Spring Boot nur die REST-API.

Kotlin Support-Richtlinie

Diese Arbeit wurde auch an IntelliJ durchgeführt.

Migrationsarbeit

pom.xml Einstellungen

pom.xml


  <properties>
...
     <java.version>1.8</java.version>
+    <kotlin.version>1.2.10</kotlin.version>
+    <kotlin.compiler.incremental>true</kotlin.compiler.incremental>
  </properties>

pom.xml


  <dependencies>
・ ・ ・
+    <dependency>
+      <groupId>org.jetbrains.kotlin</groupId>
+      <artifactId>kotlin-stdlib</artifactId>
+      <version>${kotlin.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.jetbrains.kotlin</groupId>
+      <artifactId>kotlin-reflect</artifactId>
+      <version>${kotlin.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.jetbrains.kotlin</groupId>
+      <artifactId>kotlin-test</artifactId>
+      <version>${kotlin.version}</version>
+      <scope>test</scope>
+    </dependency>
  </dependencies>

Ursprünglich habe ich kein Maven-Compiler-Plugin verwendet, aber jedes Paket ist sowohl in Java als auch in Kotlin für die Entwicklung bereit.

Ich benutze "Maven-Compiler-Plugin", um durch zu trennen.

Darüber hinaus ist spring als compilerPlugins definiert, sodass verschiedene in Spring verwendete Anmerkungen verwendet werden können. Wie in der Dokumentation erwähnt, scheint die Definition eines Feder-Plug-Ins die Notwendigkeit zu beseitigen, All-Open zu definieren.

pom.xml


  <build>
     <finalName>${project.name}</finalName>
-    <sourceDirectory>src/main/java</sourceDirectory>
-    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${resources.directory}</directory>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
     </resources>
     <testResources>
       <testResource>
         <directory>src/test/resources</directory>
       </testResource>
     </testResources>
     <plugins>
       <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
         <configuration>
           <executable>true</executable>
         </configuration>
       </plugin>
+      <plugin>
+        <artifactId>kotlin-maven-plugin</artifactId>
+        <groupId>org.jetbrains.kotlin</groupId>
+        <version>${kotlin.version}</version>
+        <configuration>
+          <compilerPlugins>
+            <plugin>spring</plugin>
+          </compilerPlugins>
+        </configuration>
+        <executions>
+          <execution>
+            <id>compile</id>
+            <goals> <goal>compile</goal> </goals>
+            <configuration>
+              <sourceDirs>
+                <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
+                <sourceDir>${project.basedir}/src/main/java</sourceDir>
+              </sourceDirs>
+            </configuration>
+          </execution>
+          <execution>
+            <id>test-compile</id>
+            <goals> <goal>test-compile</goal> </goals>
+            <configuration>
+              <sourceDirs>
+                <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
+                <sourceDir>${project.basedir}/src/test/java</sourceDir>
+              </sourceDirs>
+            </configuration>
+          </execution>
+        </executions>
+        <dependencies>
+          <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-maven-allopen</artifactId>
+            <version>${kotlin.version}</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.5.1</version>
+        <executions>
+          <!-- Replacing default-compile as it is treated specially by maven -->
+          <execution>
+            <id>default-compile</id>
+            <phase>none</phase>
+          </execution>
+          <!-- Replacing default-testCompile as it is treated specially by maven -->
+          <execution>
+            <id>default-testCompile</id>
+            <phase>none</phase>
+          </execution>
+          <execution>
+            <id>java-compile</id>
+            <phase>compile</phase>
+            <goals> <goal>compile</goal> </goals>
+          </execution>
+          <execution>
+            <id>java-test-compile</id>
+            <phase>test-compile</phase>
+            <goals> <goal>testCompile</goal> </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
  </build>

Jetzt können Sie Kotlin auf IntelliJ schreiben.

Unterstützung für STS (Eclipse)

Als ich die Mitglieder, die STS normalerweise verwenden, fragte, um die Korrespondenz zu überprüfen, funktionierte es nicht gut und ich war ein wenig süchtig danach, daher werde ich auch beschreiben, wie man mit STS umgeht.

--Installieren Sie das Kotlin Plugin für Eclipse vom Eclipse Marketplace.

buildPath.png

In der folgenden Abbildung kann es nicht ausgewählt werden, da es bereits Kotlin Nature hinzugefügt wurde. Es kann jedoch vor der Ausführung ausgewählt werden.

AddKotlinNature.png

Jetzt wird es auf STS kompiliert und Sie können auf Kotlin entwickeln.

Schreiben Sie Kotlin

Konvertieren Sie von Java-Code in Kotlin-Code

Da die Konvertierungsfunktion von IntelliJ hervorragend ist, habe ich sie grundsätzlich mit IntelliJ konvertiert. Es ist beängstigend, sie alle auf einmal zusammenzufügen, also habe ich einen oder mehrere Codes gleichzeitig konvertiert.

Wählen Sie den Code aus, den Sie konvertieren möchten, und konvertieren Sie ihn in Kotlin-Code mit "Code> Java-Datei in Kotlin-Datei konvertieren".

ConvertToKotlin.png

Da sich das Paket noch unter "src / main / java" befindet, verschieben Sie es unter "src / main / kotlin" unter dasselbe Paket. Dies funktioniert auch gut mit "Refactor> Move ..." in IntelliJ.

DI (Autowired etc.)

Zum Beispiel der folgende Code

@Service
public class HogeService {
    @Autowired
    private HogeRepository hogeRepository;
}

In Kotlin können Sie es auch mit "late init" deklarieren, aber dieses Mal habe ich es mit "Konstruktorinjektion" definiert.

@Service
class HogeService(
    private val hogeRepository: HogeRepository
) {
}

Rund um Lombok

Bei der Verwendung von Lombok trat beim Konvertieren in Kotlin manchmal ein Kompilierungsfehler auf.

Grundsätzlich werden die Klasse, die in Kotlin konvertiert, und die Klasse, auf die von Kotlin verwiesen wird, von Delombok gelöst.

Verwenden Sie das Lombok-Plug-In von IntelliJ. Es entfernt die Lombok-Konvertierung von "Refactor> Delombok".

Delombok.png

--Slf4j Annotation

Sie können die Logger-Deklaration weglassen und Code schreiben, der plötzlich Protokolle ausgibt. Bei Verwendung von Kotlin kann die Protokollvariable nicht durch den folgenden Code aufgelöst werden, was zu einem Kompilierungsfehler führt.

@Service
@Slf4j
public class HogeService {
    public void hoge() {
        log.info("hoge");
    }
}

In Kotlin kann es verwendet werden, indem der Logger mit "Companion Object" initialisiert wird.

@Service
class HogeService {
    companion object {
        private val log = LoggerFactory.getLogger(HogeService::class.java)
    }
}

Einige Leute haben die DI-Methode mit Anmerkungen ausprobiert, daher möchte ich sie einfacher machen. http://saiya-moebius.hatenablog.com/entry/2017/11/08/033932

--Datenanmerkung

Ich habe den folgenden lombokisierten Java-Code von Kotlin gelesen, und wenn ich versuche, den Hoge zu erhalten, heißt es, dass er privat und nicht zugänglich ist. In diesem Fall wurde es, wie oben beschrieben, in Delombok konvertiert. (Wenn alles zu Kotlin wird, müssen Sie Lombok überhaupt nicht verwenden ...)

@Entity
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
public class Hoge extends AbstractEntity {
	@Column(name = "hoge")
	private String hoge;
}

Über die Zukunft

Im Moment ist ein Teil des Codes jetzt Kotlinisiert und funktioniert. Ich hatte jedoch mehrere Probleme, als ich den Code tatsächlich schrieb, sodass es möglich ist, dass ich weiterhin Probleme habe. Ich denke, ich sollte immer mehr hinzufügen, wie ich damit umgehen soll.

Recommended Posts

Eine Geschichte über ein in Java geschriebenes Spring Boot-Projekt, das Kotlin unterstützt
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt
Eine Geschichte über das JDK in der Java 11-Ära
Führen Sie ein Spring Boot-Projekt mit VS-Code aus
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
Eine Geschichte über eine BeanNotOfRequiredTypeException, die nach der Anwendung von AOP im Frühjahr aufgetreten ist
Ein Memo, das Spring Boot berührte
Vergleiche Hallo Welt! Mit Spring Boot mit Java, Kotlin und Groovy
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Starten Sie mit IntelliJ ein (altes) Spring Boot-Projekt
Spring Dependency Injection mit Java, Kotlin
[Erstellen] Ein Memorandum über das Codieren in Java
Erstellen Sie mit Intellij ein Spring Boot-Projekt und beenden Sie es sofort nach dem Start
Autowired-Felder in einer Klasse, die TextWebSocketHandler in Spring Boot erbt, werden NULL
Automatische Bereitstellung von in Java entwickelten Webanwendungen mit Jenkins [Spring Boot App Edition]
Die Geschichte eines arithmetischen Überlaufs, der in Ruby nicht auftreten sollte
Eine Geschichte über die Java 11-Unterstützung für Webdienste
Eine Geschichte über das Erstellen eines Builders, der den Builder erbt
Die Geschichte des Versuchs, JAVA File zu bedienen
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Eine Bat-Datei, die Java in Windows verwendet
Überprüfen Sie mit Java / Kotlin, ob Dateien unter Windows nicht in die Benutzerkontensteuerung geschrieben werden können
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
Die Geschichte, dass der Port im Spring-Boot-Beispielprogramm unbrauchbar wird
Bis Sie ein Spring Boot-Projekt in Intellij erstellen und an Github senden
Schreiben einer Klasse, die in Java bestellt werden kann Ein kleines Standard-Memo
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Probieren Sie gRPC im Spring Boot & Spring Cloud-Projekt (Mac OS) aus.
Eine Geschichte über die Entwicklung von ROS namens Rosjava mit Java
Rufen Sie ein in Swift geschriebenes Programm von Processing (Java) auf.
Die Geschichte, dass .java auch in Unity 2018 erstellt wurde
Eine Bibliothek, die mehrzeilige Zeichenfolgen in mehrzeiligen Java-Zeichenfolgen realisiert
Erfahren Sie mehr über Spezifikationen, während Sie FizzBuzz verkürzen, das in Java geschrieben wurde
[Java / Kotlin] Escape-Verarbeitung (Bereinigung) für HTML5 mit Unbescape [Spring Boot]
Beschleunigen Sie das Testen von Validatoren, für die DI im Spring Boot erforderlich ist
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Beispiel einer Webanwendung, die mit Spring Boot 1.5 mehrere Datenbanken verwaltet
Aufrufen und Verwenden der API in Java (Spring Boot)
[Java] Eine Geschichte über IntelliJ IDEA, die die putIfAbsent-Methode von Map lehrt
Eine Geschichte darüber, wie Spring + Hibernate + MySQL-Apps die Replikation unterstützen
[MQTT / Java] Implementierte eine Klasse, die Pub / Sub von MQTT in Java ausführt
Einführung von Spring Boot2, einem Java-Framework für die Webentwicklung (für Anfänger)
Eine Geschichte über Missverständnisse im Umgang mit Java-Scannern (Memo)
[Java] Beispielprojekt zum Entwickeln von Webanwendungen mit Spring Boot
Eine Geschichte, die mich bedauerte, als während der Entwicklung der Spring Boot-App eine "NotReadablePropertyException" auftrat.
Mit [AWS] CodeStar können Sie ein Spring (Java) -Projekt erstellen, das auf Lambda in nur 3 Minuten ausgeführt wird! !!
Ich habe eine Selenium-Beispiel-App erstellt, die mehrere Browser (Chrome, IE, Firefox) unterstützt, die unter Java ausgeführt werden.
Hinweise zu Java GC
Legen Sie den Kontextparameter in Spring Boot fest
Spring Boot 2 Multiprojekt mit Gradle
[Java] Thymeleaf Basic (Spring Boot)
Suchen Sie eine Teilmenge in Java
[Java] KClass in Java herunterladen [Kotlin]
CICS-Java-Anwendung ausführen- (4) Spring Boot-App
Wichtige Änderungen in Spring Boot 1.5
NoHttpResponseException in Spring Boot + WireMock
[Java] [Spring] Spring Boot 1.4-> 1.2 Downgrade Hinweis