Migration Deep Dive für 28 · JPMS / Jigsaw öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 28 · 100 % Codeabdeckung

JPMS / Jigsaw

Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.

4Legacy-Dateien
6Modern-Dateien
64 → 79Codezeilen
11/11vollständig erfasst

Fachliche Einordnung

Legacy

Classpath-Plugin per Class.forName

Der Klassenname ist ein String; Sichtbarkeit und Abhängigkeiten sind global auf dem Classpath.

Modern

JPMS ServiceLoader mit uses/provides

Ein exportiertes SPI, module-info und ServiceLoader definieren Consumer und Provider explizit.

Vergleichsfokus: Alle Dateien werden nach technischer Rolle und fachlicher Verantwortung gruppiert.
Wichtige Abgrenzung: One-to-many-Änderungen werden als Gruppe dargestellt; eine künstliche 1:1-Zuordnung wird vermieden.

Vollständige Abdeckungsmatrix

Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.

VergleichsgruppeLegacy-DateienModern-DateienLegacy-ZeilenModern-ZeilenÄhnlichkeit
Build-Konfiguration11343447%
Plugin-Vertrag und Implementierung1271632%
Laden, Modulbeschreibung und Smoke Check2323297%

Gemeinsame Modulstruktur

Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.

Gemeinsam · 19 Zeilenpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>java-modernization-deep-dive</artifactId>
        <version>1.0.0</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>28jpmsjigsaw-pair</artifactId>
    <packaging>pom</packaging>
    <name>JPMS / Jigsaw: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

01Build-KonfigurationDirektvergleich · Legacy 34 / Modern 34 Zeilen · Ähnlichkeit 47%

Classpath- und Modulpfad-Konfiguration wird verglichen.

Legacy-DateienModern-DateienEinordnung
pom.xmlpom.xmlDirektvergleich
Semantische Ähnlichkeit: 47%

Legacy

Legacy · 34 Zeilenlegacy/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>28jpmsjigsaw-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>classpath-legacy</artifactId>
            <packaging>jar</packaging>
            <name>Classpath Legacy</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>

Modern

Modern · 34 Zeilenmodern/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>28jpmsjigsaw-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>jpms-modern</artifactId>
            <packaging>jar</packaging>
            <name>JPMS Modern</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>
02Plugin-Vertrag und ImplementierungDirektvergleich · Legacy 7 / Modern 16 Zeilen · Ähnlichkeit 32%

Konventionelles Plugin wird in exportierten Service-Vertrag und Provider getrennt.

Legacy-DateienModern-DateienEinordnung
LegacyGreetingPlugin.javaGreetingProvider.java
GermanGreetingProvider.java
Direktvergleich
Semantische Ähnlichkeit: 32%

Legacy

Modern

03Laden, Modulbeschreibung und Smoke CheckDirektvergleich · Legacy 23 / Modern 29 Zeilen · Ähnlichkeit 7%

Classpath-Scanning wird durch JPMS-Descriptor und ServiceLoader ersetzt.

Legacy-DateienModern-DateienEinordnung
LegacyPluginLoader.java
LegacyPluginLoaderTest.java
module-info.java
JpmsApplication.java
JpmsSmokeCheck.java
Direktvergleich
Semantische Ähnlichkeit: 7%

Legacy

package at.aydin.lab.jpms.legacy;

// Design Pattern: Plugin Loader / Factory – erzeugt Plugins dynamisch über Reflection.
public final class LegacyPluginLoader {
    public Object load(String className) {
        try {
            return Class.forName(className).getDeclaredConstructor().newInstance();
        } catch (ReflectiveOperationException ex) {
            throw new IllegalStateException(ex);
        }
    }
}
package at.aydin.lab.jpms.legacy;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;

class LegacyPluginLoaderTest {
    @Test
    void loadsByGlobalClassName() {
        assertInstanceOf(LegacyGreetingPlugin.class, new LegacyPluginLoader().load("at.aydin.lab.jpms.legacy.LegacyGreetingPlugin"));
    }
}

Modern

module at.aydin.lab.jpms.modern {
    exports at.aydin.lab.jpms.modern.api;
    uses at.aydin.lab.jpms.modern.api.GreetingProvider;
    provides at.aydin.lab.jpms.modern.api.GreetingProvider with at.aydin.lab.jpms.modern.internal.GermanGreetingProvider;
}
package at.aydin.lab.jpms.modern;

import at.aydin.lab.jpms.modern.api.GreetingProvider;
import java.util.*;

public final class JpmsApplication {
    private JpmsApplication() {
    }

    public static void main(String[] args) {
        GreetingProvider provider = ServiceLoader.load(GreetingProvider.class).findFirst().orElseThrow();
        System.out.println(provider.greet("Aydin"));
    }
}
package at.aydin.lab.jpms.modern;

import at.aydin.lab.jpms.modern.api.GreetingProvider;
import at.aydin.lab.jpms.modern.internal.GermanGreetingProvider;

public final class JpmsSmokeCheck {
    public static boolean valid() {
        return "Hallo Test".equals(new GermanGreetingProvider().greet("Test"));
    }
}
⌂ Cockpit