Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

di il
15 risposte

Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

Ecco la mia configurazione:
Spring Security:
http.authorizeRequests().antMatchers("/", "/login", "/logout-eseguito", "/benvenuto",
                "/registrazione", "/registrazione-eseguita", "/error", "/immagini").permitAll();
Spring Boot:

    @RequestMapping(value = { "/stile.css"}, method = RequestMethod.GET)
    public String foglioDiStile() {
        return "stile.css";
    }

    @RequestMapping(value = { "/immagini/favicon.png"}, method = RequestMethod.GET)
    public String restituisceFavicon() {
        return "favicon.png";
    }
Directory in cui si trova la foto:
/immagini/favicon.png
Inoltre mi piacerebbe non dover mappare ogni foto e vorrei dire a Spring di accettare tutte le richieste alla cartella /immagini.
Ho anche provato questo codice:
    @RequestMapping(value={"/immagini/*"})
    String mappaturaMultipla(){
        return "Viene renderizzata un'immagine.";
    }
FONTE: https://springframework.guru/spring-requestmapping-annotation/
ma non funziona.
Dove sbaglio?

15 Risposte

  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    iBaffiPro ha scritto:


    
        @RequestMapping(value = { "/stile.css"}, method = RequestMethod.GET)
        public String foglioDiStile() {
            return "stile.css";
        }
    
        @RequestMapping(value = { "/immagini/favicon.png"}, method = RequestMethod.GET)
        public String restituisceFavicon() {
            return "favicon.png";
        }
    Inoltre mi piacerebbe non dover mappare ogni foto
    Non serve tutto quello! La documentazione Static Content lo dice chiaramente:

    By default, Spring Boot serves static content from a directory called /static (or /public or /resources or /META-INF/resources) in the classpath or from the root of the ServletContext. [....]

    Queste locazioni sono controllate dalla property spring.web.resources.static-locations che per default contiene:
    [classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/]
    Quindi basta mettere nel progetto una cartella es.

    src/main/resources/static/......
    oppure
    src/main/resources/public/.....
    o
    src/main/resources/resources/.... (non mi piace molto però)

    Quindi se metti una immagine in src/main/resources/static/immagini/gatto.png
    la "vedi" su http in generale al url http://host:porta/nomecontesto/immagini/gatto.png (in Spring Boot nomecontesto è vuoto per default, se non impostato diversamente).

    E in questo scenario, con Thymeleaf è molto utile il url expression es. <img th:src="@{/immagini/gatto.png}">
    Così da essere indipendente dal nome contesto.

    P.S. vale idem per css, js, ecc...
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    Avevo anche provato quella strada ma ottenevo questo (ho riprovato ora):
    2021-06-06 15:16:30.896 DEBUG 17024 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy        : Securing GET /immagini/favicon.png
    2021-06-06 15:16:30.896 DEBUG 17024 --- [nio-8080-exec-6] s.s.w.c.SecurityContextPersistenceFilter : Set SecurityContextHolder to empty SecurityContext
    2021-06-06 15:16:30.896 DEBUG 17024 --- [nio-8080-exec-6] o.s.s.w.a.AnonymousAuthenticationFilter  : Set SecurityContextHolder to anonymous SecurityContext
    2021-06-06 15:16:30.896 DEBUG 17024 --- [nio-8080-exec-6] o.s.s.w.a.i.FilterSecurityInterceptor    : Authorized public object filter invocation [GET /immagini/favicon.png]
    2021-06-06 15:16:30.896 DEBUG 17024 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy        : Secured GET /immagini/favicon.png
    2021-06-06 15:16:30.896 DEBUG 17024 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : GET "/webapp/immagini/favicon.png", parameters={}
    2021-06-06 15:16:30.897  WARN 17024 --- [nio-8080-exec-6] o.s.web.servlet.PageNotFound             : No mapping for GET /webapp/immagini/favicon.png
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : Completed 404 NOT_FOUND
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] s.s.w.c.SecurityContextPersistenceFilter : Cleared SecurityContextHolder to complete request
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy        : Securing GET /error
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] s.s.w.c.SecurityContextPersistenceFilter : Set SecurityContextHolder to empty SecurityContext
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] o.s.s.w.a.AnonymousAuthenticationFilter  : Set SecurityContextHolder to anonymous SecurityContext
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] o.s.security.web.FilterChainProxy        : Secured GET /error
    2021-06-06 15:16:30.897 DEBUG 17024 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/webapp/error", parameters={}
    2021-06-06 15:16:30.898 DEBUG 17024 --- [nio-8080-exec-6] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
    2021-06-06 15:16:30.898 DEBUG 17024 --- [nio-8080-exec-6] o.s.c.e.PropertySourcesPropertyResolver  : Found key 'spring.template.provider.cache' in PropertySource 'configurationProperties' with value of type String
    2021-06-06 15:16:30.905 DEBUG 17024 --- [nio-8080-exec-6] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
    2021-06-06 15:16:30.905 DEBUG 17024 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 404
    2021-06-06 15:16:30.905 DEBUG 17024 --- [nio-8080-exec-6] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
    2021-06-06 15:16:30.905 DEBUG 17024 --- [nio-8080-exec-6] s.s.w.c.SecurityContextPersistenceFilter : Cleared SecurityContextHolder to complete request
    2021-06-06 15:16:30.929 DEBUG 17024 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : Securing GET /css/stile.css
    2021-06-06 15:16:30.929 DEBUG 17024 --- [nio-8080-exec-7] s.s.w.c.SecurityContextPersistenceFilter : Set SecurityContextHolder to empty SecurityContext
    2021-06-06 15:16:30.929 DEBUG 17024 --- [nio-8080-exec-7] o.s.s.w.a.AnonymousAuthenticationFilter  : Set SecurityContextHolder to anonymous SecurityContext
    2021-06-06 15:16:30.929 DEBUG 17024 --- [nio-8080-exec-7] o.s.s.w.a.i.FilterSecurityInterceptor    : Authorized public object filter invocation [GET /css/stile.css]
    2021-06-06 15:16:30.929 DEBUG 17024 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : Secured GET /css/stile.css
    2021-06-06 15:16:30.930 DEBUG 17024 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : GET "/webapp/css/stile.css", parameters={}
    2021-06-06 15:16:30.930  WARN 17024 --- [nio-8080-exec-7] o.s.web.servlet.PageNotFound             : No mapping for GET /webapp/css/stile.css
    2021-06-06 15:16:30.930 DEBUG 17024 --- [nio-8080-exec-7] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
    2021-06-06 15:16:30.930 DEBUG 17024 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : Completed 404 NOT_FOUND
    2021-06-06 15:16:30.930 DEBUG 17024 --- [nio-8080-exec-7] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
    2021-06-06 15:16:30.930 DEBUG 17024 --- [nio-8080-exec-7] s.s.w.c.SecurityContextPersistenceFilter : Cleared SecurityContextHolder to complete request
    2021-06-06 15:16:30.931 DEBUG 17024 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : Securing GET /error
    2021-06-06 15:16:30.931 DEBUG 17024 --- [nio-8080-exec-7] s.s.w.c.SecurityContextPersistenceFilter : Set SecurityContextHolder to empty SecurityContext
    2021-06-06 15:16:30.931 DEBUG 17024 --- [nio-8080-exec-7] o.s.s.w.a.AnonymousAuthenticationFilter  : Set SecurityContextHolder to anonymous SecurityContext
    2021-06-06 15:16:30.931 DEBUG 17024 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy        : Secured GET /error
    2021-06-06 15:16:30.931 DEBUG 17024 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/webapp/error", parameters={}
    2021-06-06 15:16:30.931 DEBUG 17024 --- [nio-8080-exec-7] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
    2021-06-06 15:16:30.932 DEBUG 17024 --- [nio-8080-exec-7] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json;q=0.1', given [text/css, */*;q=0.1] and supported [application/json, application/*+json]
    2021-06-06 15:16:30.932 DEBUG 17024 --- [nio-8080-exec-7] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Writing [{timestamp=Sun Jun 06 15:16:30 CEST 2021, status=404, error=Not Found, message=No message available, (truncated)...]
    2021-06-06 15:16:30.932 DEBUG 17024 --- [nio-8080-exec-7] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
    2021-06-06 15:16:30.932 DEBUG 17024 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 404
    2021-06-06 15:16:30.932 DEBUG 17024 --- [nio-8080-exec-7] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
    2021-06-06 15:16:30.932 DEBUG 17024 --- [nio-8080-exec-7] s.s.w.c.SecurityContextPersistenceFilter : Cleared SecurityContextHolder to complete request
    
    La pagina si renderizza correttamente ma l'accesso all'immagine e al foglio di stile non viene autorizzato:
    
    <!DOCTYPE HTML>
    <html lang="it">
    <head>
        <title>Benvenuto!</title>
        
        <link rel="shortcut icon" type="image/png" src="/webapp/immagini/favicon.png"/>
        
        <link href="/webapp/css/stile.css" rel="stylesheet" type="text/css">
    </head>
    <body>
    
    <div class="menu_principale">
        <a href="/webapp/">Home</a>
        &nbsp;|&nbsp;
        <a href="/webapp/amministratore">Amministratore</a>
        &nbsp;|&nbsp;
        <a href="/webapp/proprietario">Proprietario</a>
        &nbsp;|&nbsp;
        
        
        
        <a href="/webapp/login">Login</a>
        
        &nbsp;|&nbsp;
        <a href="/webapp/registrazione">Registrazione</a>
    </div>
    <h2><span>Pagina di benvenuto</span></h2>
    <img src="/webapp/immagini/favicon.png">
    </body>
    </html>
    

    Immagine.png
    Immagine.png

  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    Ho trovato la classe che da problemi:
    
    @Configuration
    @EnableWebMvc
    public class CaricamentoFileValidazione implements WebMvcConfigurer {
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            // Questo metodo carica il file: validazione.properties
            messageSource.setBasename("classpath:validazione");
            // Questo metodo setta il tipo di caratteri che possono essere usati nel file .properties.
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    
    }
    
    Se la rimuovo l'immagine appare nella pagina, il foglio di stile pure ma la favicon no.
    Il problema però è che quella classe mi serve per aggiungere validazione.properties al progetto:
    
    NomeUtenteVuoto=Il nome utente è richiesto.
    PasswordVuota=La password è richiesta.
    ConfermaPasswordVuota=La conferma della password è richiesta.
    NomeUtenteNonDisponibile=Il nome utente non è disponibile.
    PasswordNonCoincidenti=Le 2 password che hai inserito non coincidono.
    NomeUtenteNonAccettabile=Il nome utente non rispetta le specifiche richieste.
    PasswordNonAccetabile=La password non rispetta le specifiche richieste.
    
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    Se aggiungo questo risolvo tranne per la favicon che continua a non comparire.
    
    @Configuration
    @EnableWebMvc
    public class CaricamentoFileValidazione implements WebMvcConfigurer {
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            // Questo metodo carica il file: validazione.properties
            messageSource.setBasename("classpath:validazione");
            // Questo metodo setta il tipo di caratteri che possono essere usati nel file .properties.
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    
        // Il metodo permette di aggiungere le risorse statiche contenute in "src/main/resources/static/".
        // Il metodo non è necessario quando il metodo messageSource() non è presente nell'applicazione.
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler(
                    "/immagini/**",
                    "/css/**",
                    "/js/**")
                    .addResourceLocations(
                            "classpath:/static/immagini/",
                            "classpath:/static/css/",
                            "classpath:/static/js/");
        }
    
    }
    
    FONTE: https://memorynotfound.com/adding-static-resources-css-javascript-images-thymeleaf/
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    Se uso th:href funziona anche la favicon:
    <link th:fragment="favicon" rel="shortcut icon" type="image/png" th:href="@{/immagini/favicon.png}"/>
    L'immagine invece va bene anche con src:
    <img th:src="@{/immagini/favicon.png}">
    Non c'è un modo per rimuovere CaricamentoFileValidazione e salvare quel file .properties in una posizione standard in maniera da non dover implementare WebMvcConfigurer?
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    iBaffiPro ha scritto:


        <link rel="shortcut icon" type="image/png" src="/webapp/immagini/favicon.png"/>
        <link href="/webapp/css/stile.css" rel="stylesheet" type="text/css">
        <a href="/webapp/">Home</a>
        <a href="/webapp/amministratore">Amministratore</a>
        <a href="/webapp/proprietario">Proprietario</a>
        <a href="/webapp/login">Login</a>
        <a href="/webapp/registrazione">Registrazione</a>
    <img src="/webapp/immagini/favicon.png">
    
    Questa /webapp che si vede è il nome del contesto? Stai facendo un WAR oppure no?

    iBaffiPro ha scritto:


    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            // Questo metodo carica il file: validazione.properties
            messageSource.setBasename("classpath:validazione");
            // Questo metodo setta il tipo di caratteri che possono essere usati nel file .properties.
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    
    Neanche questo servirebbe!! Spring Boot ha già la gestione predefinita dei messaggi con un apposito MessageSource predefinito. Quindi quale è il motivo per non usarlo?

    iBaffiPro ha scritto:


    Se uso th:href funziona anche la favicon:
    <link th:fragment="favicon" rel="shortcut icon" type="image/png" th:href="@{/immagini/favicon.png}"/>
    L'immagine invece va bene anche con src:
    <img th:src="@{/immagini/favicon.png}">
    L'ho già detto altre volte, se usi gli url expression che sono context-relative (cioè @{/ ...... } ), servono principalmente per essere indipendenti dal nome contesto. Se non li usi, devi emettere tu in output il nome del contesto e questo generalmente è una rogna.

    iBaffiPro ha scritto:


    Non c'è un modo per rimuovere CaricamentoFileValidazione e salvare quel file .properties in una posizione standard in maniera da non dover implementare WebMvcConfigurer?
    I messaggi sono già gestiti in maniera predefinita, senza dover fare altro:

    src/main/resources/messages.properties
    che è il default, poi eventualmente declinato in varie lingue es.
    src/main/resources/messages_it.properties

    Ma il default ci DEVE sempre essere se c'è una lingua specifica perché l'auto-configuration del MessageSource "guarda" innanzitutto solo se c'è il messages.properties


    E se stai facendo un WAR, allora oltre a mettere <packaging>war</packaging> devi anche fare quello che è indicato qui: 10.17.1. Create a Deployable War File
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    Spettacolo!


    Usando messages.properties tolgo una classe. Il link che mi hai mandato mostra come il metodo creato per costruire il file .war possa tranquillamente convivere con la classe che contiene il main(), questo mi permette di cancellare un'altra classe e snellire ulteriormente l'applicazione. Con i tuoi consigli risparmio 2 classi ed ho una webapp decisamente più leggibile. E' tutto merito tuo! Grazie infinite!

    Il codice:
    System.setProperty("server.servlet.context-path", "/webapp");
    non lo userò in "produzione" (*) ma l'ho aggiunto solo per verificare se l'applicazione funziona anche quando la inserisco in una cartella diversa da quella standard che mi viene fornita dal sistemista.

    (*) Ho messo "produzione" tra virgolette perché se vado avanti di questo passo non riuscirò neppure a realizzare l'applicazione che voglio. Questa login mi sta facendo davvero perdere un sacco di tempo.

    Grazie ancora!

    P.S.: Devo ancora scegliere un nome alla webapp ma ci penso alla fine.
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    iBaffiPro ha scritto:


    System.setProperty("server.servlet.context-path", "/webapp");
    Questo non ti può di certo funzionare per un WAR.
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    Se sull'IDE l'applicazione funziona su "http://localhost:8080/webapp" ho la certezza, non assoluta ovviamente, che quando metto il war dentro una directory /webapp/ funzioni alla perfezione.
    1) E' giusto quello che scrivo o dovrei procedere diversamente?
    2) Prima di produrre il war di produzione oltre a scegliere il profilo giusto (quello con le password del DB reale) se lascio la riga di codice seguente la webapp si avvia?
    System.setProperty("server.servlet.context-path", "/webapp");
    L'idea è di mettere sullo stesso server diverse applicazioni:
    a) webapp > applicazione in java
    b) blog > applicazione in wordpress
    c) static > applicazione statica
    ecc...
    grazie
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    iBaffiPro ha scritto:


    System.setProperty("server.servlet.context-path", "/webapp");
    Questa riga, l'ho già detto prima, non serve a niente se fai un war! Le property di Spring Boot quali specialmente server.servlet.context-path e server.port (ma in generale le altre server.***) valgono SOLO se si fa partire l'applicazione in modalità standalone con il server embedded. Perché in questo caso l'applicazione HA il controllo completo del server e quindi può imporre context-path, porta, ecc...

    Se produci un war non puoi imporre un bel niente di quelle cose. Il server sta già altrove con le sue configurazioni ed è avviato/stoppato con tempi e modalità generalmente ben differenti. Il nome del contesto (context path) è di base (salvo altri truschini server-specifici) correlato al nome del war estensione esclusa. Se produci un webapp.war il nome del contesto è webapp. Se lo rinomini in pippo.war e fai deploy, il nome del contesto è pippo. Punto.

    Quello che succede in un IDE è che se fai il deploy su un server configurato nel IDE, vengono sicuramente usate le informazioni presenti nel pom.xml.
    Non ho particolare esperienza con WAR in Spring Boot (generalmente lo uso standalone) ma nei "comuni" progetti di webapp (NON Spring Boot) in Eclipse il plugin m2e-wtp usa il <warName> del maven-war-plugin, se non c'è guarda il <finalName> e se non c'è neanche questo, se non sbaglio usa ${artifactId}-${version}
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    E' giusto scritto così?
    
    	<build>
    		<pluginManagement>
    			<plugins>
    				<!--/* Plugin che scarica a seconda dell'ambiente di sviluppo la singola dipendenza richiesta dal
    				progetto. */-->
    				<plugin>
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-compiler-plugin</artifactId>
    				</plugin>
    				<plugin>
    					<!--/* E' un plugin di Maven che permette di dare un nome specifico al file .war. */-->
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-war-plugin</artifactId>
    					<configuration>
    						<warName>script</warName>
    					</configuration>
    				</plugin>
    			</plugins>
    		</pluginManagement>
    	</build>
    
    Ti chiedo perché a me non funziona correttamente questo plugin in quanto per cambiare nome al .war non basta editare <warName> bensì cancellare la cartella "target".
    Domani cambio nome a questa webapp, "script" è davvero inguardabile.
    Succedono anche cose strane:
    Aggiungo una versione del plugin al pom, la tolgo e tutto per magia si mette a funzionare.
    Sbaglio sicuramente ad usare questo plugin.
    Sono anche indeciso se caricare questo componente come plugin oppure come dipendenza.
    ${artifactId}-${version} proprio non mi piace.
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    iBaffiPro ha scritto:


    
    				<!--/* Plugin che scarica a seconda dell'ambiente di sviluppo la singola dipendenza richiesta dal
    				progetto. */-->
    				<plugin>
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-compiler-plugin</artifactId>
    				</plugin>
    				<plugin>
    					<!--/* E' un plugin di Maven che permette di dare un nome specifico al file .war. */-->
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-war-plugin</artifactId>
    					<configuration>
    						<warName>script</warName>
    					</configuration>
    				</plugin>
    Sinceramente, non si capisce neanche il senso/utilità dei commenti che hai messo. Il maven-compiler-plugin non è quello che "scarica le dipendenze". È il plugin che si occupa della fase di compilazione. Punto.

    iBaffiPro ha scritto:


    Ti chiedo perché a me non funziona correttamente questo plugin in quanto per cambiare nome al .war non basta editare <warName> bensì cancellare la cartella "target".
    Domani cambio nome a questa webapp, "script" è davvero inguardabile.
    Succedono anche cose strane:
    Aggiungo una versione del plugin al pom, la tolgo e tutto per magia si mette a funzionare.
    Sbaglio sicuramente ad usare questo plugin.
    Allora: una premessa innanzitutto. Te lo avevo già detto, Spring Boot ha una "opinione" sulle versioni di molte dipendenze e anche sui plugin. Queste versioni scelte da Spring Boot le vedi nel pom di spring-boot-dependencies che è il "parente" di spring-boot-starter-parent.

    Ad esempio in Spring Boot 2.4.5, la versione managed del maven-war-plugin è la 3.3.1 che è molto recente (anzi, è la più recente, ad oggi, anche se è del Luglio 2020).

    Queste versioni managed servono per far sì che nel TUO pom tu non debba per forza specificarle, perché già Spring Boot le ha dichiarate in quanto quelle sono le versioni garantite e già verificate che sono ok per quella versione di Spring Boot. Vale per gli starter, per molte dipendenze "notevoli" (es. log4j, junit, ecc...) e anche per svariati plugin.

    E te lo avevo già detto sicuramente: con le versioni managed, se proprio vuoi impostarne una diversamente, non va messo il <version> nella dipendenza/plugin ma va messa la property come è definita in questo caso da Spring Boot.
    Se metti il <version>, un IDE "pignolo" ti può dare un warning del tipo "attenzione, stai facendo un override di una versione managed" (Eclipse mi dà un warning: "Overriding managed version 3.3.1 for maven-war-plugin").

    Quindi meglio es.:
    <properties>
        <maven-war-plugin.version>3.3.0</maven-war-plugin.version>
        .....
    Ma a parte questo aspetto, c'è un modo banale per impostare il nome finale. L'ho detto prima: il default viene preso dal ${project.build.finalName} che si imposta semplicemente con
    <build>
        <finalName>tuonomedelwar</finalName>
       ....
    Tutto lì, NON c'è bisogno di esplicitare il maven-war-plugin SOLO per questo (cioè se non devi configurare "altro" sotto <configuration>). Se non c'è il finalName, il default ulteriore è ${artifactId}-${version} .

    iBaffiPro ha scritto:


    Sono anche indeciso se caricare questo componente come plugin oppure come dipendenza.
    Un plugin è .. un plugin! NON una dipendenza. Ma che stai dicendo?!
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    Hai ragione, non si inseriscono in quel modo le versioni dei plugin/dipendenze, me lo avevi già detto.
    Nel frattempo, ho scoperto il motivo di questi malfunzionamenti. Su IntelliJ bisogna premere su un pulsante dopo aver aggiornato il pom.xml affinché le modifiche compaiano alla volta successiva che si preme su run.
    Una cosa che non ho capito è come fai a vedere le versioni delle dipendenze che vengono caricate da IntelliJ. Usi l’IDE? Google?
    Un’altra cosa che non so è la differenza tra un plugin ed una dipendenza. Per me sono pezzi di software aggiunti al mio progetto.
    Ho messo il codice che mi hai dato, inoltre premendo sul tasto apposito tutto funziona alla perfezione.
    ${artifactId}-${version} non mi piace perché mette il numero della versione del programma nel nome del file, quindi nella URL e non mi va di rinominare il .war ogni volta anche se ora non ho ancora un server e non sto facendo l'upload di nulla.
    Sempre grazie
  • Re: Non riesco ad inserire le immagini dentro la mia webapp in Spring Boot

    iBaffiPro ha scritto:


    Su IntelliJ bisogna premere su un pulsante dopo aver aggiornato il pom.xml
    Sì, non mi ricordo bene ma se hai il pom.xml aperto nell'editor e lo aggiorni+salvi, sbuca fuori un pulsantino con l'icona di "refresh".

    iBaffiPro ha scritto:


    Una cosa che non ho capito è come fai a vedere le versioni delle dipendenze che vengono caricate da IntelliJ.
    Dovresti aprire la finestra-vista "Maven" (vedi https://www.jetbrains.com/help/idea/maven-projects-tool-window.html )
    Lì dovrebbe farti vedere anche tutto l'albero delle dipendenze. Di più non ricordo (non ho un IntelliJ IDEA a portata ora)

    In alternativa, da prompt: mvn dependency:tree
    stampa l'albero delle dipendenze in forma testuale ... meglio che niente anche se non è il massimo ...

    iBaffiPro ha scritto:


    Un’altra cosa che non so è la differenza tra un plugin ed una dipendenza. Per me sono pezzi di software aggiunti al mio progetto.
    No, le "dipendenze" sono artefatti software che servono al TUO progetto, insomma, il tuo progetto dipende da quelle per funzionare. Quindi le dipendenze saranno usate a runtime e portate avanti nel packaging dove/come necessario (escludendo quelle provided).

    I plugin servono SOLO a Maven per fare tutte le varie operazioni durante un build. Il nucleo di Maven è davvero piccolissimo, da solo non fa un bel nulla, cioè senza plugin. Maven definisce principalmente i 3 lifecycle (cicli di vita) che hanno le loro phases (fasi) predefinite e ciascun plugin poi si aggancia semplicemente a una/più di queste fasi.
    Queste nozioni le vedi qui: Lifecycle Reference

    Quando lanci: mvn compile
    Maven esegue tutte le fasi del lifecycle "Default" fino al compile compreso (quindi: validate --> initialize --> ..... --> compile).
    Per ciascuna fase va a vedere quali plugin sono agganciati a quella fase e passa la esecuzione a loro. In pratica Maven non compila, non testa, non esegue un bel nulla. Sono i plugin che fanno queste cose.

    Se ad esempio guardi la documentazione del Maven Compiler Plugin, elenca due "goal" specifici del plugin:

    compiler:compile is bound to the compile phase
    compiler:testCompile is bound to the test-compile phase

    Ovvero questo plugin si aggancia a 2 fasi del ciclo default.

    E i plugin appunto NON servono alla tua applicazione.
Devi accedere o registrarti per scrivere nel forum
15 risposte