[JAVA] J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin

Aperçu

Présenté avant Application Web remplie de bogues ["EasyBuggy"](https://github.com/k-tamura/easybuggy/blob/master/README Réimplémentez le clone basé sur Spring Boot "EasyBuggy Boot" de .jp.md) dans Kotlin Je l'ai vu ("EasyBuggy Bootlin").

Vous pouvez le télécharger depuis cette page et le démarrer avec la commande suivante.

java -jar ROOT.war
: writing_hand_tone1: Java 8 ou supérieur est requis pour démarrer. Si vous définissez `java -jar ROOT.war --port = 9000`, il démarrera sur le port 9000.

En ajoutant l'option Java comme indiqué ci-dessous, vous pouvez générer des journaux, déboguer et surveiller avec JMX. Il limite également l'utilisation maximale de la mémoire, ce qui le rend plus sujet à des problèmes tels que OutOfMemoryError.

java -Xmx256m -XX:MaxPermSize=64m -XX:MaxDirectMemorySize=90m -XX:+UseSerialGC -Xloggc:logs/gc.log -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M -XX:GCTimeLimit=15 -XX:GCHeapFreeLimit=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/ -XX:ErrorFile=logs/hs_err_pid%p.log -agentlib:jdwp=transport=dt_socket,server=y,address=9009,suspend=n -Dderby.stream.error.file=logs/derby.log -Dderby.infolog.append=true -Dderby.language.logStatementText=true -Dderby.locks.deadlockTrace=true -Dderby.locks.monitor=true -Dderby.storage.rowLocking=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7900 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -ea -jar ROOT.war

Lorsque le message suivant s'affiche, l'application Web a été lancée.

2017-10-19 16:36:01.065  INFO 5304 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2017-10-19 16:36:01.075  INFO 5304 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
2017-10-19 16:36:01.242  INFO 5304 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-10-19 16:36:01.249  INFO 5304 --- [           main] o.t.e.Easybuggy4ktApplicationKt          : Started Easybuggy4ktApplicationKt in 37.355 seconds (JVM running for 38.916)

Lorsque vous visitez http: // localhost: 8080, vous verrez la page principale.

demo_ebk_ja_startup.gif

Le démarrage est un peu lent (environ 15 secondes. EasyBuggy démarre dans 3 secondes ...)

Méthodes de démarrage autres que celles ci-dessus

Vous pouvez également le démarrer avec git clone et gradle bootRun.

$ git clone https://github.com/k-tamura/easybuggy4kt
$ cd easybuggy4kt
$ gradle bootRun
`server.port = $ {port: 8080}` ligne dans `src / main / resources / application.properties` est remplacée par` server.port = 9000` Ensuite, il démarrera sur le port 9000.

Vous pouvez également déployer ROOT.war dans un conteneur Java tel que Tomcat 8.5 et cela fonctionnera également.

Utilisation de cette application

Semblable à "Easy Buggy" et "Easy Buggy Boot", le but est de reproduire, analyser et approfondir la compréhension des différents obstacles. La raison pour laquelle je l'ai réimplémenté à Kotlin était parce que je voulais savoir ce qui suit:

――Est-il possible de créer des vulnérabilités et des fuites de ressources dans les applications implémentées avec Kotlin?

  • Que faut-il pour réimplémenter une application implémentée en Java dans Kotlin?
  • Kotlin améliore-t-il la lisibilité en réimplémentant les applications implémentées par Java?

démo

Ce qui suit est une démonstration de l'accès à la page où la fuite de mémoire se produit plusieurs fois et de l'observation de l'état de la fuite de mémoire.

demo_ebk_ja_memleak.gif

Différences de configuration

Les principales différences dans les configurations de «EasyBuggy», «EasyBuggy Boot» et «EasyBuggy Bootlin» sont les suivantes.

Différence EasyBuggy EasyBuggy Boot EasyBuggy Bootlin
Langue Java Java Kotlin
Technologie de base Servlet 3.0.1 Spring Boot 1.5.6 (Servlet 3.0.1) Spring Boot 1.5.7 (Servlet 3.0.1)
Couche de présentation inutilisé(Certains JSP 2.2 + JSTL 1.2) Thymeleaf 2.1.5 (Certains JSP 2.3 + JSTL 1.2) Thymeleaf 2.1.5 (Certains JSP 2.3 + JSTL 1.2)
Conteneur de servlet Tomcat 7.0.37 Tomcat 8.5.16 Tomcat 8.5.20
Client DB/serveur JDBC / Derby 10.8.3.0 Spring JDBC 4.3.9 / Derby 10.12.1.1 (Pour Java 7), Ou 10.13.1.1 (Pour Java 8) Spring JDBC 4.3.11 / Derby 10.13.1.1
Client LDAP/serveur Apache DS Client API 1.0.0 / Server 1.5.5 Spring LDAP 2.3.1 / unboundid-ldapsdk 3.2.1 Spring LDAP 2.3.1 / unboundid-ldapsdk 3.2.1
Email JavaMail 1.5.1 JavaMail 1.5.1 (Java Mail introduit par Spring Boot Mail 1.5.Remplacer 6) JavaMail 1.5.1 (Java Mail introduit par Spring Boot Mail 1.5.Remplacer 6)
Outils de développement Aucun Spring Boot Developer Tools 1.5.6 Spring Boot Developer Tools 1.5.7
Outil de création Maven Maven Gradle
Java Prend en charge Java 6 et supérieur Prend en charge Java 7 et supérieur Prend en charge Java 8 et supérieur

Comment construire

Vous pouvez créer un fichier war exécutable et déployable avec la commande suivante:

$ gradle clean build

Méthode de développement

Pour le développement d'EasyBuggy Bootlin, nous utilisons IntelliJ IDEA de JetBrains, qui a développé Kotlin. J'ai choisi IntelliJ plutôt que STS car il avait des fonctionnalités utiles comme la conversion de programmes Java en programmes Kotlin. Grâce à IntelliJ, j'ai pu développer cette application en un temps assez court.

Pour accélérer le développement, démarrez EasyBuggy Bootlin avec gradle bootRun tout en construisant en continu avec gradle build --continuous. Avec cette méthode, si vous modifiez le code source, Spring Boot DevTools le rechargera automatiquement pour refléter la modification.

demo_ebk_ja_devtool.gif

Recommended Posts