Maven e JARs (dipendenze)

746 views
Skip to first unread message

Stefano Tranquillini

unread,
Jun 7, 2013, 12:15:29 PM6/7/13
to jug...@googlegroups.com
Ciao a tutti,
sto facendo dei progetti in Java e ho iniziato ad usare Maven. Comodissimo per fare i vari import.
Ora, devo usare l'app che ho creato dentro tomcat. se genero il jar e lo metto in tomcat l'applicazione non va perche' mancano tutte le dipendenze.

Voi come gestite la cosa? fate manuale (quindi download delle librerie e copia in tomcat) o cosa?

Ho googlato un po' e pare che maven abbia dei plugin per copiare le dipendenze, ma al momento non riesco a farli andare.

In aggiunta, se il mio progetto usa delle librarie non-maven (cioe' scritte da me e aggiunte come jar esterno), come gestite questo?

ciao.

--
Stefano

Simone Bordet

unread,
Jun 7, 2013, 12:22:00 PM6/7/13
to jugtaa
Ciao,

2013/6/7 Stefano Tranquillini <stefano.tr...@gmail.com>:
> Ciao a tutti,
> sto facendo dei progetti in Java e ho iniziato ad usare Maven. Comodissimo
> per fare i vari import.
> Ora, devo usare l'app che ho creato dentro tomcat. se genero il jar e lo
> metto in tomcat l'applicazione non va perche' mancano tutte le dipendenze.

Se è una webapp devi generare un war, non un jar, e poi deployare il war.
Basta specificare:

<packaging>war</packaging>

O, ancora meglio, usi Jetty invece di Tomcat e il Jetty Maven Plugin:
http://www.eclipse.org/jetty/documentation/current/maven-and-jetty.html.
Così non devi deployare ogni volta che cambi qualcosa nella tua webapp.

--
Simone Bordet
----
http://cometd.org
http://webtide.com
http://intalio.com
Developer advice, training, services and support
from the Jetty & CometD experts.
Intalio, the modern way to build business applications.

Stefano Tranquillini

unread,
Jun 7, 2013, 12:33:08 PM6/7/13
to jug...@googlegroups.com
ecco, no, non e' un war.
e' un jar.
e' una libreria da usare all'interno di una webapp di tomact. 


2013/6/7 Simone Bordet <sbo...@intalio.com>

--
You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jugtaa+un...@googlegroups.com.
To post to this group, send email to jug...@googlegroups.com.
Visit this group at http://groups.google.com/group/jugtaa?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.





--
Stefano

Simone Bordet

unread,
Jun 7, 2013, 12:39:12 PM6/7/13
to jugtaa
Ciao,

2013/6/7 Stefano Tranquillini <stefano.tr...@gmail.com>:
> ecco, no, non e' un war.
> e' un jar.
> e' una libreria da usare all'interno di una webapp di tomact.

La webapp dipende dal tuo jar, e transitivamente dalle sue dipendenze.
Devi far il re-build il war e il redeploy.

Se nel rebuild del war non hai le dipendenze del tuo jar, hai
sbagliato il pom.xml del tuo jar.

Stefano Tranquillini

unread,
Jun 7, 2013, 12:44:08 PM6/7/13
to jug...@googlegroups.com
il war non centra.
ho un jar, che va perfettamente in eclipse.
ora, se lo  uso al di fuori di eclipse mancano le dipendenze.
come faccio a esportare jar e dipendenze?

--
You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jugtaa+un...@googlegroups.com.
To post to this group, send email to jug...@googlegroups.com.
Visit this group at http://groups.google.com/group/jugtaa?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.





--
Stefano

Mario Passamani

unread,
Jun 7, 2013, 1:26:25 PM6/7/13
to jug...@googlegroups.com
Scusa Stefano,

ma non capisco una cosa: il jar (applicazione/libreria) che hai creato, funziona solo quando è utilizzato all'interno di un progetto Eclipse o no?

Se è vero, allora devi controllare le dipendenze di Eclipse e "a mano" trasferirle nel pom (non so se c'è un plugin di maven che lo fa, di sicuro ne esiste uno che fa il contrario, cioè genera le dipendenze associate in un progetto Eclipse a partire dal pom.xml).

Se no, allora dovrebbe già funzionare "da command line" con maven da solo: ipotizzo che tu lo abbia provato dal runtime di Tomcat lanciato da dentro Eclipse.

Se è così, l'unica cosa da fare è scoprire cosa aggiunge Eclipse alle librerie di Tomcat rispetto all'esecuzione normale: basta aggiungere quello alle tua "WEB-INF/lib" (con maven, in fase di deploy come ricordato da Simone) e il gioco è fatto.


2013/6/7 Stefano Tranquillini <stefano.tr...@gmail.com>



--

I watched the stars fall silent from your eyes.

Andrea Selva

unread,
Jun 7, 2013, 3:02:46 PM6/7/13
to jug...@googlegroups.com
Ciao,
come ha detto Simone le web app di solito son autocontenute, quindi il war contiene tutto ciò serve all'app per essere eseguita, quindi se da una tua web-app vuoi usare la tua lib, basterà che tu installi la tua lib sul local repository di  maven con "mvn install" e poi re-buildi il war.
 C'è la possibilità di mettere dei jar nella commons/lib del tomcat, ma è pratica sconsigliatissima, credo per aggiornare le lib la dentro dentro devi riavviare il server, mentre con le web app riescono a ricaricare le definizioni di classe, ma li dipende molto del web app server; tomcat dopo un pò di redeploy ti manda in permgen graziosamente, glasshfish in teoria dovrebbe farcela se le tue lib sono dei moduli OSGi.
 Cmq per non impazzire a trovare le dipendenze transitive a mano potresti fare "uber jar" autocontenuto con il plugin assembly:

<build>
       <plugins>
               <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass> tua calsse main</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
       </plugins>
</build>



Due note:
 * non son sicuro che il tag mainClass sia necessario
 * devi togliere dalle tue dip a runtime tutto ciò che riferisce le api servelet, altrimenti il server non dovrebbe partire per doppia definizione di classe

Spero d'aver dato un'idea, comunque sia, i jar shared a livello di web server non sono una buona pratica
 Andrea



2013/6/7 Mario Passamani <mario.p...@gmail.com>

Stefano Tranquillini

unread,
Jun 8, 2013, 3:28:52 AM6/8/13
to jug...@googlegroups.com
il war centra poco con il problema. 
Io ho da creare un jar con le varie dipendenze, se vogliamo fare un esempio minimo pensate ad avere una classe che usa log4j. se non esporto la dipendenza di log4j la mia classe non va.
pensavo che maven esportasse i jar in automatico, ma cosi' non e'.
provo l'uber jar dopo.
grazie


2013/6/7 Andrea Selva <selva...@gmail.com>



--
Stefano

Simone Bordet

unread,
Jun 8, 2013, 4:37:31 AM6/8/13
to jugtaa
Ciao,

2013/6/8 Stefano Tranquillini <stefano.tr...@gmail.com>:
> il war centra poco con il problema.
> Io ho da creare un jar con le varie dipendenze, se vogliamo fare un esempio
> minimo pensate ad avere una classe che usa log4j. se non esporto la
> dipendenza di log4j la mia classe non va.
> pensavo che maven esportasse i jar in automatico, ma cosi' non e'.
> provo l'uber jar dopo.

Guarda, sei veramente fuori strada, oppure non ti sei spiegato bene.

Progetto JAR, pom.xml

<project...>
<groupId>it.tranquillini</groupId>
<artifactId>stefano-jar</artifactId>
<version>1.2.3</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

Questo pom.xml dichiara che il tuo jar dipende da Log4J.

Progetto WAR, pom.xml

<project...>
<groupId>it.tranquillini</groupId>
<artifactId>stefano-war</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>it.tranquillini</groupId>
<artifactId>stefano-jar</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>

Questo pom.xml dichiara che il tuo war dipende da "stefano-jar".

Quando fai il build del war, Maven vede la dipendenza con
"stefano-jar" e la mette in WEB-INF/lib. Poi Maven vede che
"stefano-jar" dipende da Log4J e transitivamente importa la dipendenza
e la mette anch'essa in WEB-INF/lib.
Ogni volta che hai un artifact che dipende da "stefano-jar", Maven
importa transitivamente anche Log4J.

Così funziona di sicuro da command line, che ti raccomando.

Eclipse IDE non è neanche decente per scrivere una nota da una riga,
figuriamoci l'integrazione con Maven.
Magari tutti i tuoi problemi sono dovuti ad Eclipse che non funziona
piuttosto che da Maven.

Raccomando di *non* provare l'uberjar finché non hai capito cosa c'è
che non va nel tuo progetto. L'uberjar *non* è la soluzione giusta nel
99.9% dei casi.
Se posti i tuoi pom.xml sarebbe meglio.

--
Simone Bordet
http://bordet.blogspot.com
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless. Victoria Livschitz

Stefano Tranquillini

unread,
Jun 8, 2013, 4:46:19 AM6/8/13
to jug...@googlegroups.com
allora non mi sono spiegato bene. Il WAR non centra.
Il WAR e' activiti, non lo redeployo ha un refactoring per caricare le calssi. quindi basta mettere il jar della mia classe e lo trova.

Ora, per fare questo jar da mettere in activiti dipende da un altro progetto che ho creato io e che e' in eclipse. mi sa che non ho linkato nel pom questo jar da me creato (che a sua volta ha dipendenze).

Come posso linkare un jar generato da un altro progetto?


2013/6/8 Simone Bordet <simone...@gmail.com>
--
You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jugtaa+un...@googlegroups.com.
To post to this group, send email to jug...@googlegroups.com.
Visit this group at http://groups.google.com/group/jugtaa?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.





--
Stefano

Stefano Tranquillini

unread,
Jun 8, 2013, 5:43:59 AM6/8/13
to jug...@googlegroups.com
ho linkato il jar locale.
ora mi trovo questo nel pom.


<modelVersion>4.0.0</modelVersion>
<groupId>org.crowdcomputer</groupId>
<artifactId>CrowdTaskOperations</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Implementation of the Tasks</name>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.12</version> <!-- Current Activiti Engine Version -->
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0-beta6</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0-beta6</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.crowdcomputer.sdk</groupId>
<artifactId>cc-sdk-java</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>Activiti</id>
</repository>
</repositories>
</project>

il problema e' che se eseguo il metodo della classe non trova log4j e tutto il resto.
per creare il jar ho dato mvn package.
ho dimenticato qualcosa nel pom?



2013/6/8 Stefano Tranquillini <stefano.tr...@gmail.com>



--
Stefano

Andrea Selva

unread,
Jun 8, 2013, 6:51:15 AM6/8/13
to jug...@googlegroups.com
Il pom manca del tag packaging, così come l'hai postato.
Ora ho capito, tu hai la web app di activiti, che serve a giocherellare con i processi, in uun task del processo probabilmente vuoi invocare qualcosa che sta nella tua lib, lib che a sua volta dipende da altro.
 Io activiti l'ho sempre usato come engine all'interno di altre web app, quindi avevo la risuluzione delle dipendenze implicita. Non sono convinto si possa fare quanto dici, temo che l'unica strada sia quella della risoluzione delle dipendenze a mano, oppure ti scrivi la tua web app, usando Activiti come libreria e quindi avendo la risoluzione delle dip implicita.

 Andrea




2013/6/8 Stefano Tranquillini <stefano.tr...@gmail.com>

Stefano Tranquillini

unread,
Jun 8, 2013, 7:22:00 AM6/8/13
to jug...@googlegroups.com
esatto.
allora faccio a mano.
il tag packaging che e' ?
Reply all
Reply to author
Forward
0 new messages