Před rokem jsem psal o tom, že máte dát sbohem javax. Ale svět není tak růžový. Spring Bootu 2.x už skončila podpora zdarma. Spring Boot 3 vyžaduje Spring Framework 6 a ten zase Jakarta EE 9. Taková perlička, placený JBoss EAP k dnešnímu dni neumí Jakarta EE 9, neplacený WildFly ano. A to už existuje Jakarta EE 10. Ale to rozebírat nechci. Už dříve jsme si ukázali, jak javax závislosti zakázat. Když jsem připravoval release, tak jsem se vyděsil, že enforcer plugin mám sice nastavený, ale přesto mi v kódu smrdí třeba import javax.annotation.Nullable. Kde a proč se to tam vzalo?

Guava

Abych to zkrátil, javax závislost jako bean validation nebo servlet se mi do artefaktu nedostaly, ale Guava si sebou táhne vlastní implementaci jsr305 a tudíž můžete opravdu použít import javax.annotation.Nullable. Disputace, zda potřebujete s moderní Javou záviset na Guavě, respektive návod, jak se jí zbavit si nechme na jindy. Respektive může vám ji vnutit transitivně třeba OWASP/java-html-sanitizer (jako bonus ve zranitelné verzi) (kovářova kobyla, hlavně že v TOP 10 je A06:2021 – Vulnerable and Outdated Components) nebo například google-api-client.

Enforcer Plugin

Naštěstí tu máme enforcer plugin, který toho umí víc. Lze zakázat konkrétní importy, viz následující konfigurace.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>de.skuzzle.enforcer</groupId>
            <artifactId>restrict-imports-enforcer-rule</artifactId>
            <version>2.5.0</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>enforce-banned-java-imports</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <RestrictImports>
                        <!--  https://github.com/google/guava/issues/2960  -->
                        <reason>Guava depends on jsr305, but we prefer jakarta in our code</reason>
                        <bannedImport>javax.annotation.**</bannedImport>
                    </RestrictImports>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

Celý projekt si můžete stáhnout z GitHubu a zkusit, že build skutečně selže.

mvn clean validate

Závěr

Je vidět, že javax má tuhý kořínek a stále se chce někudy vecpat. Ukázali jsme si další možnosti enforcer pluginu, který může fungovat jako taková ruční brzda a hlídat neposedné transitivní závislosti.

Související