Migration Deep Dive für 33 · SMTP und Mail öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 33 · 100 % Codeabdeckung

SMTP und Mail

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.

3Legacy-Dateien
4Modern-Dateien
64 → 80Codezeilen
8/8vollständig erfasst

Fachliche Einordnung

Legacy

JavaMail javax.mail Factory

Parameter werden einzeln an eine Factory übergeben; die API verwendet javax.mail.

Modern

Jakarta Mail Gateway plus Command

Ein unveränderlicher MailCommand beschreibt den Auftrag; das Gateway kapselt Jakarta Mail und Transport.send.

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-Konfiguration11343477%
Mail-Erzeugung/-Gateway, Command und Test23304640%

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>33smtpmail-pair</artifactId>
    <packaging>pom</packaging>
    <name>SMTP und Mail: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

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

javax- und Jakarta-Mail-Abhängigkeiten werden verglichen.

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

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>33smtpmail-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>javax-mail-legacy</artifactId>
            <packaging>jar</packaging>
            <name>Javax Mail Legacy</name>

            <dependencies>
                <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version></dependency>
<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>33smtpmail-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>jakarta-mail-modern</artifactId>
            <packaging>jar</packaging>
            <name>Jakarta Mail Modern</name>

            <dependencies>
                <dependency><groupId>org.eclipse.angus</groupId><artifactId>jakarta.mail</artifactId><version>2.0.3</version></dependency>
<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>
02Mail-Erzeugung/-Gateway, Command und TestDirektvergleich · Legacy 30 / Modern 46 Zeilen · Ähnlichkeit 40%

Factory-artige Nachrichtenerzeugung wird in Command und Gateway getrennt.

Legacy-DateienModern-DateienEinordnung
LegacyMailFactory.java
LegacyMailFactoryTest.java
JakartaMailGateway.java
MailCommand.java
JakartaMailGatewayTest.java
Direktvergleich
Semantische Ähnlichkeit: 40%

Legacy

package at.aydin.lab.mail.legacy;

// Design Pattern: Factory – erzeugt vorkonfigurierte MimeMessage-Objekte.
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public final class LegacyMailFactory {
    public MimeMessage create(String from, String to, String subject, String body) throws Exception {
        Session session = Session.getDefaultInstance(new Properties());
        MimeMessage m = new MimeMessage(session);
        m.setFrom(new InternetAddress(from));
        m.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
        m.setSubject(subject, "UTF-8");
        m.setText(body, "UTF-8");
        return m;
    }
}
package at.aydin.lab.mail.legacy;

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

class LegacyMailFactoryTest {
    @Test
    void createsJavaxMessage() throws Exception {
        assertEquals("Test", new LegacyMailFactory().create("a@example.test", "b@example.test", "Test", "Body")
                .getSubject());
    }
}

Modern

package at.aydin.lab.mail.modern;

import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.util.*;

// Design Pattern: Gateway
// Zweck: Jakarta-Mail-API bleibt außerhalb des fachlichen Aufrufers.
public final class JakartaMailGateway {
    private final Session session;
    public JakartaMailGateway(Properties properties) {
        session = Session.getInstance(properties);
    }

    public MimeMessage prepare(MailCommand c) throws Exception {
        MimeMessage m = new MimeMessage(session);
        m.setFrom(new InternetAddress(c.from()));
        m.setRecipient(Message.RecipientType.TO, new InternetAddress(c.to()));
        m.setSubject(c.subject(), "UTF-8");
        m.setText(c.body(), "UTF-8");
        return m;
    }

    public void send(MailCommand c) throws Exception {
        Transport.send(prepare(c));
    }
}
package at.aydin.lab.mail.modern;

// Design Pattern: Command
// Zweck: Vollständiger Versandauftrag wird als unveränderliches Objekt übergeben.
public record MailCommand(String from, String to, String subject, String body) {
}
package at.aydin.lab.mail.modern;

import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

class JakartaMailGatewayTest {
    @Test
    void preparesWithoutSending() throws Exception {
        var g = new JakartaMailGateway(new Properties());
        assertEquals("Test", g.prepare(new MailCommand("a@example.test", "b@example.test", "Test", "Body")).getSubject());
    }
}
⌂ Cockpit