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.
Grundsätzlich implementiert Spring Boot nur die REST-API.
Diese Arbeit wurde auch an IntelliJ durchgeführt.
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.
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.
src / test / kotlin
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.
Jetzt wird es auf STS kompiliert und Sie können auf Kotlin entwickeln.
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".
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.
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
) {
}
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".
--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;
}
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