Classpath-Plugin per Class.forName
Der Klassenname ist ein String; Sichtbarkeit und Abhängigkeiten sind global auf dem Classpath.
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.
Der Klassenname ist ein String; Sichtbarkeit und Abhängigkeiten sind global auf dem Classpath.
Ein exportiertes SPI, module-info und ServiceLoader definieren Consumer und Provider explizit.
Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.
| Vergleichsgruppe | Legacy-Dateien | Modern-Dateien | Legacy-Zeilen | Modern-Zeilen | Ähnlichkeit |
|---|---|---|---|---|---|
| Build-Konfiguration | 1 | 1 | 34 | 34 | 47% |
| Plugin-Vertrag und Implementierung | 1 | 2 | 7 | 16 | 32% |
| Laden, Modulbeschreibung und Smoke Check | 2 | 3 | 23 | 29 | 7% |
Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.
Classpath- und Modulpfad-Konfiguration wird verglichen.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| pom.xml | pom.xml | Direktvergleich Semantische Ähnlichkeit: 47% |
<?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><?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>Konventionelles Plugin wird in exportierten Service-Vertrag und Provider getrennt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyGreetingPlugin.java | GreetingProvider.java GermanGreetingProvider.java | Direktvergleich Semantische Ähnlichkeit: 32% |
package at.aydin.lab.jpms.legacy;
public final class LegacyGreetingPlugin {
public String greet() {
return "Hallo aus dem Classpath";
}
}package at.aydin.lab.jpms.modern.api;
// Design Pattern: Service Provider Interface
// Zweck: Consumer hängt nur von exportiertem API-Package ab.
public interface GreetingProvider {
String greet(String name);
}package at.aydin.lab.jpms.modern.internal;
import at.aydin.lab.jpms.modern.api.GreetingProvider;
public final class GermanGreetingProvider implements GreetingProvider {
public String greet(String name) {
return "Hallo " + name;
}
}Classpath-Scanning wird durch JPMS-Descriptor und ServiceLoader ersetzt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyPluginLoader.java LegacyPluginLoaderTest.java | module-info.java JpmsApplication.java JpmsSmokeCheck.java | Direktvergleich Semantische Ähnlichkeit: 7% |
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"));
}
}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"));
}
}