Spring Boot postanowił zepsuć Mavena

Jest sobie tak, że Spring Boot to fajna rzecz. W połączeniu z kilkoma prostymi dodatkami w rodzaju AngularJS i HSQLDB idealnie nadaje się do napisania aplikacji pokazowej na jakiś wykładzik. Tym razem trafiło na wykład o CI/CD zatem potrzebowałem skonfigurować kilka rzeczy. Jedną z nich jest maven-resource-plugin, który umożliwia m.in. podmianę treści plików w czasie budowania. Robi się to prosto w pom.xml dajemy:

Listing 1. konfiguracja pom.xml


    11010


    
        
            org.springframework.boot
            spring-boot-maven-plugin
        

        
            org.apache.maven.plugins
            maven-resources-plugin
            2.7
        
    
    
        
            src/main/resources
            true
        
    

najpierw ustawiamy pożądaną własność w sekcji properties, a potem w build.resources włączamy filtrowanie. Kolejny krok to przygotowanie pliku application.properties z konfiguracją naszej aplikacji:

Listing 2. konfiguracja application.properties

server.port=${run.port}

odpalamy i…

If you are inheriting from the spring-boot-starter-parent POM, the default filter token of the maven-resources-plugins has been changed from ${*} to @ (i.e. @maven.token@ instead of ${maven.token}) to prevent conflicts with Spring-style placeholders. If you have enabled maven filtering for the application.properties directly, you may want to also change the default filter token to use other delimiters.

Jak się okazuje jakiś kutasiarz w Springu postanowił sobie przekonfigurować dla jaj to jak działa maven. Pogratulować kurwa… Powyższe tłumaczenie ma jakiś tam sens, ale na bogów to przekracza wszelkie granice. Wiele lat temu była taka magiczna zasada by aplikacja była jak najmniej związana z wykorzystywanymi rozwiązaniami. Stąd wszystkie JSR-y, specyfikacje i tym podobne cyrki. Jednak ktoś ma to w dupie… tym kimś jest ekipa od springa. I jest to cholernie przykre, bo sami propagowali hasło „łatwej zmiany dostawcy”…

ps. prawidłowy plik powinien wyglądać tak:

Listing 3. prawidłowa konfiguracja application.properties

server.port=@run.port@

co tylko potwierdza, że ten kto to wymyślił w springu jest chujem i sadystą. Jak ja kurwa nienawidzę windowsowych zmiennych…

4 myśli na temat “Spring Boot postanowił zepsuć Mavena

  1. Podmiana resourców jest potrzebna tylko gdy coś musi być zahardkodowane w czasie builda z tego czy innego powodu, a application.properties to nie jest hardcod, tylko wartości domyślne.

    Spring Boot ma cały rozbudowany mechanizm propertiesów: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

    … i te wartości domyślne można dostarczyć poprzez zmienne środowiskowe, system properties, JNDI, command line (jeśli uruchamiane jako JAR), init params servletów, …

    A jak coś jest niepotrzebne to może dlatego zostało zrobione byle jak 😛

    Inna sprawa – jeśli to nowy projekt to może lepiej użyć Gradla?

  2. @iirekm, potrzebuję pobawić się z zapisem wartości do application.properties, bo chcę pokazać trochę inną rzecz, a Spring Boot jest tylko przy okazji. Co do gradle to fajny, ale znowuż to nie jest clou problemu i docelowo ma całość działać bez problemów w czasie prezentacji.

  3. Jakbyś to inaczej rozwiązał?

    P.S. Jakich problemów z gradlem spodziewasz się na prezentacji?

  4. @Łukasz, co do gradla to po prostu obawiał się tego, że „coś wybuchnie” np. Jenkins się zbuntuje.

    Co do placeholderów to pozwoliłbym na konflikty i wysypanie się builda. Z dwóch powodów. Po pierwsze by użytkownik miał świadomość, że ma taką konfigurację, która będzie potencjalnie powodować konflikty. Po drugie co jeżeli powstanie maven 4 i nie będzie pluginu dla springa, który dokonuje odpowiedniej „podmiany”?

    Generalnie złym pomysłem jest zmiana zachowania narzędzia do budowania przez jedną z zależności.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax