Java Getriebe

Java und NetBeans

Kein Auto-Update der Oracle JRE auf Java 9

Oracle hat eine Java SE Support Roadmap für das aktuelle Java SE heraus gegeben. Neben der Tatsache, dass Java 9 nur bis nächsten März (also nur bis zur Version 18.3) offiziell mit Updates versorgen möchte, finde ich den folgenden Absatz interessant:

Oracle does not plan to migrate desktops from Java 8 to Java 9 through the auto update feature. Instead of relying on a pre-installed standalone JRE, we will begin encouraging application developers to deliver JREs with their applications. More details will be made available through early 2018.

Die Entwickler sollen also in Zukunft nicht mehr darauf vertrauen, dass auf dem Zielsystem eine aktuelle Java-Version vorhanden ist, sondern mit der Anwendung zusammen eine (angepasste) JRE installieren sollen. Wie auch schon in oben genannten Artikel von mir gesagt, weiß ich noch nicht so genau, ob ich das gut finden soll.

Streams und Maps

Es gibt gefühlt hunderte Seiten, die sich mit der Streams API aus Java 8 befassen. Alle haben furchtbar tolle Tipps und vor allem Beispiele, wie man die Daten aus seinen Listen über Streams und den unausweichlichen Lambdas verarbeiten, filter und umwandeln kann. In unserer (gewachsenen) Anwendung verwenden wir allerdings weniger oft Listen und Sets als viel mehr etliches an Maps. Der Großteil unserer Daten sind als Schlüssel-Wert Paare gespeichert. Wenig ist eine „beliebige“ Datenmenge sondern explizit benannte Daten.

Die Stream sind allerdings auf einzeln aufgereihte Objekte ausgelegt und nicht auf Name-Value-Datenpaare. Dies macht das Handling innerhalb der Streams etwas unhandlich, vor allem, wenn man zwar durch die Values iterieren möchte, diese auch gerne per map() in andere Datentypen umwandeln möchte, aber der Schlüssel darf dabei nicht verloren gehen, da dieser unbedingt mit den zugehörigen Daten bzw. Objekten verknüpft bleiben sollte oder gar muss.

Für die Verarbeitung dieser Paare innerhalb der Streams bedeutet dies meist, dass man irgendwie mit Map.Entry<> 1 hantiert. Diese sollte man in der Regel allerdings als Immutable betrachten, so dass man bei jeder Änderung von Key oder (häufiger) Value eine neue Instanz erstellen muss. Leserlicher wird der Code dadurch selten.

Mein Ansatz für einen etwas leserlicheren Code ist der folgende:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static <K, V> Map.Entry<K, V> toEntry(K key, V value) {
  return new AbstractMap.SimpleImmutableEntry<>(key, value);
}

public static <K, V, M> Map.Entry<M, V> mapKey(
        Map.Entry<K, V> org, Function<K, M> mapper) {
  return toEntry(mapper.apply(org.getKey()), org.getValue());
}

public static <K, V, M> Map.Entry<K, M> mapValue(
        Map.Entry<K, V> org, Function<V, M> mapper) {
  return toEntry(org.getKey(), mapper.apply(org.getValue()));
}

Damit lässt sich der Quelltext mit den Streams deutlich kürzer schreiben und enthält keine new Aufrufe die in diesem Zusammenhang nur den Lesefluss stören.

Ein Beispiel

In „parameters“ ist eine Menge von „Parameter“ Objekten die jeweils ein „Name“-„Wert“ Paar darstellen. Für eine Fremdbibliothek müssen unsere Namen in „deren“ Namen umgewandelt werden und dann diese neuen Schlüssel mit allen nicht-null Werten von „Parameter“ in eine bestehende Map „data“ (die bereits andere Daten enthält) geschrieben werden.

1
2
3
4
5
6
7
8
9
10
11
parameters.stream()
    // get all Mapping (m) to all Parameter (p)
    .map(p -> toEntry(p, mappingManager.get(p)))
    .filter(pm -> pm.getValue() != null)
    .map(pm -> mapValue(vm, m -> m.getKey()))
    .map(pk -> mapKey(pk, p -> p.getValue()))
    .filter(vk -> vk.getKey() != null)
    // write all Values (v) with the mapped keys (k) to data
    .collect(() -> data,
        (map, vk) -> map.put(vk.getValue(), vk.getKey()),
        Map::putAll);

ps: Ich will nicht behaupten, dass das Beispiel guter Code ist. Er soll nur zeigen, dass die Hilfsmethoden die Übersichtlichkeit beim Arbeiten mit Key-Value-Paaren erhöht.

Is An Agile Java Standard Possible? – Simon Ritter

Java Champion und JUG Leader der JUG London, Simon Ritter hat in einem Blogpost auf „DZone Java“ über die Zukunft der Entwicklung von Java und seine Plattform geschrieben. In Is An Agile Java Standard Possible? schreibt er davon, dass es denkbar sei, dass nicht mehr bis zu einem „Major Release“ der Java Plattform gewartet wird bis ein „JDK Enhancement Proposal“ (JEP) für jederman nutzbar wird, sondern dass diese JEPs bereits vorher schon in die aktuelle JDK eingepflegt werden.

Even programming languages need to adapt to the more modern methodologies. See how Java, through JEPs, is making the change and what challenges lie ahead.

Read More

NetBeans will ein Apache Projekt werden

Quelle: NetBeansProposal – Incubator Wiki

Im Incubator Wiki der Apache Foundation steht seit heute morgen ein Antrag von Oracle um das Projekt NetBeans komplett unter der Schirmherrschaft der Foundation zu stellen.

Es stehen in der Liste der Unterstützer neben diversen Mitgliedern des NetBeans DreamTeams auch etliche Mitarbeiter von Oracle auf der Liste. Somit wird der aktuelle Besitzer wohl auch weiterhin der der NetBeans IDE und Plattform weiter arbeiten.

Spannend ist dies auf jeden Fall. Vor allem auf so kurz vor der JavaOne Konferenz. Über die Gründe von Oracle lässt sich nur spekulieren, aber ich persönlich hoffen, dass die NetBeans IDE auch weiterhin die Referenz-IDE für neue Java Versionen bleibt.

Fehler beim Parsen von XSLT Stylesheets abfangen

Die meisten XSLT Umwandlungen habe ich bisher im Browser erledigt. XML im Browser laden und als HTML darstellen lassen. Das begrenzt mich zwar größtenteils auf XSLT 1.0, aber ich kann mir diverse Ergebnisse, die hier erzeugt werden wunderbar im Browser anschauen und dank SVG sogar mit hübschen bunten Bildern.
Read More

Markdown Support für die NetBeans IDE

Ich habe für mich selber schon mal ein NetBeans Plugin geschrieben, welches mir Markdown Dateien innerhalb der IDE in gerenderter Form darstellen kann. Ein Test, der für mich selbst recht gut funktioniert.

Dankenswerterweise hat sich Florian Reiss ebenfalls mit dem Problem beschäftigt und ein entsprechendes Plugin erstellt, welches deutlich mehr kann als meine Version: Markdown Support – NetBeans Plugin detail.

Leider ist das Plugin nicht innerhalb der IDE im Plugin Manager zu installieren (@Florian, falls du das hier liest: Bitte lass das Plugin verifizieren, wäre cool), aber auf der GitHub Seite kann man sich eine fertige NBM Datei herunterladen und so manuell installieren. (Bei André Gewert gibt es dazu auch ein kleines Tutorial)

Auch ich habe seinerzeit pegdown verwendet. Ein einfache zu verwendendes Tool, welches den Vorteil hat dass es komplett in Java geschrieben ist und somit keine „externen“ Abhängigkeiten benötigt.

Search & Replace in Dateien

Die Änderungen in den letzten beiden Java Versionen sind toll. NIO2, Streams und Lambdas machen einige Dinge unheimlich effizient und kompakt. Ich habe aktuell zum Beispiel das Problem, dass ich in einem Verzeichnisbaum bestimmte (Text-)Dateien suchen muss und darin eine bestimmte Zeile durch einen neuen Wert ersetzen möchte.
Read More