Code Mining

Was ist Eclipse Code Mining? Code Mining ist nichts anderes als CodeLense von Microsoft. CodeLens ist jedoch markenrechtlich durch Microsoft geschützt. Folglich muss für das sich noch in der Entwicklung befindene Plugin ein anderer Name her. Das Plugin wird auf GitHub gehostet und von Angelo Zerr entwickelt. Unterstützt wird das ganze von Lars Vogel.

Installation

Da sich das Plugin noch in der Entwicklung befindet, ist es noch kein Bestandteil der Eclipse Distribution und muss über eine UpdateSite installiert werden. Installieren Sie einfach alles aus dem Repository.

Nach dem üblichen Neustart der Workbench steht Ihnen das Plugin zur Verfügung.

Einstellungen

Per Default ist das Feature erst einmal noch nicht aktiv.

Das Grub Bootmenü

Auf meiner 4K fähigen Grafikkarte wird automatisch der 4K Modus gewählt, was einen guten Eindruck für den gesamten Bootvorgang über Grub, Kernel und SDDM macht, da kein wechsel der Auflösung mehr vorkommt. Jedoch benötigt Grub beim Aufbau (man kann zusehen) des Menüs ca. 5 Sekunden. Und genauso lange benötigt er auch wieder um das Menü zu löschen.

Ändern der Auflösung

sudo mcedit /etc/default/grub

Anpassen der Auflösung. Ich habe hier 1024×768 mit einer Farbtiefe von 16 gewählt.

GRUB_GFXMODE=1024x768x16

Damit die Änderungen wirksam werden, muss jedoch die Konfiguration neu erstellt werden:

sudo grub-mkconfig -o /boot/grub/grub.cfg

Gradle Wrapper wirft Excetion

Beim Bauen eines Projektes mit dem Gradle Wrapper in der Verison 4.8 kommt es zu einer Excetion

> java.lang.ExceptionInInitializerError

wenn Gradle Wrapper mit OpenJDK > 9 gestartet wird. Mit JDK 8 und 9 tritt der Fehler nicht auf.

Neuer Milestone M12 erreicht

Am 14.06.2018 wurde der Milestone M12 freigegeben. Mit der Freigabe wurden diverse Bugs behoben und einige Verbesserungen vorgenommen:

  • JDK 9 und JDK 10 werden unterstützt, auch wenn die IDE unter JDK 8 läuft
  • Die Live Hoovers werden jetzt in allen geöffneten Editoren aktualisiert
  • Etliche NPE im Indexer wurden beseitigt

Siehe Changelog

Am 07.07.2018 wurde mit 3.11.0 die letzte Version von Jooq freigegeben.

Neues in Version 3.11.0

Neu in der Version 3.11.0 sind die implizieten Joins die man aus ORM Frameworks wie Hibernate, Doctrine oder anderen her kennt.

Beispiel für implizietes joinen

Gegeben seinen 2 Tabellen Buch und Author die über den Join miteinander verknüpft werden.

SELECT author.vorname, author.nachname, buch.titel
FROM buch
JOIN author ON buch.author_id = author.id

Das Framework Hibernate ist in der Lage dieses im internen Graphen zu erkennen und automatisch (impliziet) zu joinen und daher ist folgendes Query valide:

SELECT buch.author.vorname, buch.author.nachname, buch.titel FROM buch

In der neuen Version 3.11.0 wird im Codegenerator Code erzeugt, der die Berechnung des Graphen on the fly übernimmt und den Join hinzufügt. Somit ist folgender Code nun möglich:

ctx.select(BUCH.author().VORNAME, BUCH.author().NACHNAME, BUCH.TITEL)
   .from(BUCH)
   .fetch();

Dies kann auf beliebige Queries mit beliebiger Verschachtelungstiefe erfolgen.

Siehe auch type-safe-implicit-join-through-path-navigation-in-jooq-3-11.

Window Funktionen unter MariaDB 10.2 werden unterstützt

Mit dem Schließen des Tickets 7514 werden die Window Funktionen in MariaDB unterstützt.

Parser

Der Parser der SQL Statements parsen und in einen AST überführen kann wurde weiter verbessert. Eine Demo zum übersetzen von verschiedenen SQL-Dialekten steht unter translate zur Verfügung. Es wurden viele neue Klauseln und Funktionen verschiedener Hersteller in (DDL, DML) hinzugefügt.

Java 10 Support

Java 10 wird erstmals mit Integrationstest abgedeckt. Um eindeutige Paketnamen in den verschiedenen Modulen zu gewähren, wurde der Code entsprechend refaktorisiert.

Fehlerkorrekturen

Natürlich sind auch jede Menge weiterer Fehler in der Version behoben worden. Alle Fehler und weiteren Features sind auf der Notes Seite zu finden.

Scala wird aus OSS Version entfernt

Der Support für Scala wird ab Version 3.11.0 aus der OSS Version entfernt. Scala kann nur noch mit der Pro oder Enterprise Version verwendet werden.

Default ComponentScan von SpringBoot

SpringBoot prüft beim Starten alle Packages die in dem gleichen Package und unterhalb des Packages der @SpringBootApplication Annotations Klasse zu finden sind.

Das Default verhalten überschreiben

Möchte man die Struktur der Anwendung umändern, so muss man die Spring Boot mitteilen wo die Komponenten zu finden sind. Anderenfalls wird der Start der Anwendung zu Fehlern führen, da SpringBoot nicht alle Komponenten finden kann. Hierfür kann man z.B. an der Klasse, die die @SpringBootApplication Annotation besitzt, die Annotation @ComponentScan anfügen. Mit ComponentScan(BasePackages = {“”}) kann man als StringArray die Packages angegeben in denen die Komponenten zu finden sind.

Achtung: Komponenten die in oder unterhalb der @SpringBootApplication Klasse sich befinden müssen ebenfalls angegeben werden, da hier das Default Verhalten von SpringBoot überschrieben worden ist.

Spring Boot mit Hibernate

Kommt es beim Starten einer Spring Boot Anwendung zu einer ClassNotFoundException, weil die javax.xml.bind.JAXBException nicht gefunden worden ist, dann fehlt hier die Dependency für JAXB.

Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) ~[na:na]

Hibernate benötigt typischerweise JAXB, welches per default ab Java 9 nicht mehr sichtbar ist. Entweder mit –add-modules java.xml.bind zur Laufzeit oder als Abhängigkeit einbinden.

Dependency JAXB hinzufügen

Unter Gradle (letzte Version unter Maven Central suchen JAXB)

compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'

Gitea Dienst unter git.xxx.org soll mit SSL Verschlüsselung ausgestattet werden. Es werden verschiedene Domains auf dem Server bedient. Als Reverse Proxy ist bereits NginX vorgeschaltet. Daher muss nicht einmal die Gitea Konfiguration geändert werden. Es kann über NginX die Verschlüsselung mit SSL geschehen.

Die LetsEncrypt Initiative macht es sehr einfach Webseiten mit einem gültigen Zertifikat auszustellen. Dazu gibt es verschiedene Clients die die Verwaltung vornehmen. Ich verwende hier den Certbot.

Installation Certbot unter Arch Linux

yaourt -S --noconfirm certbot-nginx

Erstellen eines Zertifikates

Das Plugin für Certbot parst das ConfigFile von NginX und zeigt alle Domains an, die auf dem Server einen eigenen Serverblock besitzen. Da wir die Konfiguration nicht verändern wollen, rufen wir den certbot mit dem Parameter certonly auf. Damit wird nur ein Zertifikat für die gewählten Domains erstellt. Hierfür muss man natürlich im Besitz der Domain sein.

certbot --nginx certonly

[root@server conf]# certbot --nginx certonly
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): xxx@web.de

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: ----
2: git.xxx.org
3: ----
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 2
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mrpeacockgit.duckdns.org
2018/06/02 09:50:20 [notice] 9946#9946: signal process started
Waiting for verification...
Cleaning up challenges
2018/06/02 09:50:25 [notice] 9948#9948: signal process started

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/git.xxx.org/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/git.xxx.org/privkey.pem
Your cert will expire on 2018-08-31. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le

Wie man in der Ausgabe erkennen kann, legt der certbot unterhalb /etc/letsencrypt/live/ für jede Domain ein Verzeichnis an. In diesem wird das Zertifikat und der private Schlüssel abgelegt.

Einbinden des Zertifikates in NginX

Die Konfiguration für den Gitea Service ist in eine eigene Datei ausgelagert. Diese wird per Include Anweisung eingebunden. Hierfür ist ein separates conf-Verzeichnis unterhalb /etc/nginx/ ratsam.

#
# Gitea Service
#
include conf/git.conf;

Damit alte Links bzw. der direkte Aufruf mit dem unverschlüsselten HTTP Protokoll weiterhin funtkioniert muss eine 301 Weiterleitung eingerichtet werden.

# Redirect http -> https
server {
    listen 80;
    server_name git.xxx.org;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;

    server_name git.xxx.org;

    # logging
    error_log /var/log/nginx/gitea_error.log debug;
    access_log /var/log/nginx/gitea_access.log;

    client_max_body_size 100M; # Push large Objects to gitea

    # Configuration for letsencrypt
    location ^~ /.well-known/acme-challenge/ {
        allow all;
        root /var/lib/letsencrypt/;
        default_type "text/plain";
        try_files $uri =404;
    }

    location / {
        proxy_pass http://127.0.0.1:3000;
    }

    # SSL
    ssl on;
    ssl_certificate /etc/letsencrypt/live/git.xxx.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/git.xxx.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Konfiguration von Gitea

Da in diesem Beispiel NGinX als Reverse Proxy vorgeschaltet ist, muss hier nur die Root URL angepasst werden. Es ist HTTPS als Protokoll und 443 als Port anzugeben. Gitea selbst arbeitet weiterhin mit dem HTTP Protokoll.

[server]
; Listen protocol. One of 'http', 'https', 'unix' or 'fcgi'.
PROTOCOL                   = http
DOMAIN                     = git.xxx.org
ROOT_URL                   = https://git.xxx.org:443/

Wildcard Zertifikate

In einem anderen Artikel beschreibe ich wie man lokale Dienste mit einem Wildcard Zertifikat absichern kann. Hierfür setzte ich den freien DNS Dienst DuckDNS ein.

Gradle modularisieren

Es können externe Buildskripte eingebunden werden. Es macht mit wachsender Größe des Buildsriptes Sinn bestimmte Teile auszulagern. Diese externen Gradle Buildskripte sollten auch auf .gradle enden. Mit der apply from Anweisung kann Gradle externe Buildskripte inkludieren. Die Anweisung apply from erwartet eine URI als Parameter, so dass neben den lokalen Dateien auch Buildskripte von einem Webserver nachgeladen werden können. So können die Module zum Beispiel zentral verwaltet werden (lokaler Webserver).

Im Buildskript kann mit:

apply from: 'eclipse.gradle'

die nachfolgende eclipse.gradle eingebunden werden…

//
// Fix Modulepath
//
eclipse.classpath.file {
    whenMerged {
        entries.findAll { isModule(it) }.each { it.entryAttributes['module'] = 'true' }
    }
}

boolean isModule(entry) {
    // filter java 9 modules
    entry.kind == 'lib'  // Only libraries can be modules
}