Dúvida Maven [básico]

Olá pessoal!

Tenho andado a estudar o Maven e tenho vindo a gostar bastante. Contudo, apercebi-me que ele não funciona como eu pensava lol. Então é o seguinte:

Quando criamos um projecto Maven (simples e com package tipo .jar,por exemplo) nós esperamos ter no fim do lifecycle a nossa aplicação pronta a correr. Para ser mais concreto, depois de criar o project e o código fonte corre-se o comando: mvn package. Até aqui tudo bem, no final tem-se um arquivo .jar pronto a ser executado. Podemos também incluir dependências referentes a outros projectos que criamos anteriormente no maven que tudo funciona bem.

Então qual é o “problema”?

O “problema” é quando temos dependências exteriores que as coisas já não funcionam do mesmo modo. Fiz um pequeno exemplo de uma aplicação que utiliza uma biblioteca exterior (Lucene), configurei o POM nesse sentido e o maven foi buscar tudo o que era preciso(.jar pom etc etc). No final do lifecycle eu obtenho o .jar da minha aplicação mas quando tento correr a aplicação fora do maven (java -cp MinhaApp.jar mainclass ou java -jar MinhaApp) ele dá excepção porque não encontra a dependência no classpath. No entanto se correr com o maven através do plugin exec tudo funciona certinho, mas aí eu já compreendo que o plugin configura a classpath e tal.

Eu tinha a idéia que uma vez terminado o lifecycle,a aplicação estaria pronta a correr INDEPENDENTE do maven, mas isso não acontece porque as dependências não são incluídas na aplicação, e é isso que não entendo, não entendo porque é que o fim do lifecycle não comporta a inclusão das dependências (só assim é que aplicação pode correr independente do ambiente).

Eu sei que é possível incluir as dependências no arquivo da aplicação utilizando o plugin assembly e existem também outras formas, mas porque é que esse não é o comportamento predefinido? Em que contexto é que se pode querer uma aplicação que não contém as suas próprias dependências?ela só vai funcionar se as dependências estiverem no classpath e não se pode partir desse princípio (de desenvolvedor para desenvolvedor eu até compreendo para não haver duplicação de libs mas de desenvolvedor para cliente não entendo).

Agradecia que me dessem uma luz sobre isso, está a custar-me perceber e eu já li bastante sobre gestão de dependências do maven etc…talvez eu não esteja a ver as coisas da forma correcta ou então preciso de mais algum background.

Obrigado!

Ola,

Seguinte, o maven trabalha com esquemas de plugin, tem plugin pra quase tudo, e no ciclo de vida básico dele não consta “gerar executável”, para isto há um plugin.

Segue um exemplo de como eu fiz aqui:
1º: Eu configurei o plugin do maven “maven-jar-plugin”, que é o plugin que gera o jar, para gerar o jar incluindo no MANIFEST a referencia para as dependencias do projeto, e disse que elas estarão no diretório “lib/”.

<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<archive>
						<addMavenDescriptor>false</addMavenDescriptor>
						<manifest>
							<addClasspath>true</addClasspath>
							<classpathPrefix>lib/</classpathPrefix>
							<mainClass>org.component.launcher.Main</mainClass>
						</manifest>
					</archive>
				</configuration>
			</plugin>

2º: após isto, eu usei o plugin, tb do maven, para copias as dependencias para o diretório “lib/”.

<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<configuration>
							<outputDirectory>${project.build.directory}/lib</outputDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>

Então, isto dentro do … no pom do projeto, após executar o “mvn clean package” o .jar gerado é um executável, que pode ser executado atraves de um duplo-clique ou pelo prompt.

Espero ter ajudado.

Ha, esqueci de citar, na configuração do plugin “maven-jar-plugin”, onde eu configuro a geração do MANIFEST, pode-se observar que eu também indiquei a MAIN-CLASS do projeto.

Muito obrigado BrunoCarlo, era mesmo isso que precisava saber para tirar a minha dúvida. No projecto final todas as dependências terão de estar incluídas, mas para efeitos de desenvolvimento não é necessário pois utiliza-se o repositório local do maven, já percebi! Mais uma vez obrigado!

Olá.

Quase não faço posts no forum… portanto esse topico foi de grande utilidade pra mim.
Estava exatamente com a mesma duvida do SrFabio e ja tinha o conhecimento sobre plugins, dependencias e etc, porém não entendia o porque de o .jar não reconhecer meus IMPORT.
Sempre lançava uma exception NoClassDefFound.

Então por que estou postando?

Primeiro pra agradecer e segundo pra preencher esse topico com mais palavras chave, pois eu realmente demorei a encontra-lo.

Sem mais,
obrigado e parabéns ao BrunoCarlo pela dica.

Salvou o meu dia hehe…
Obrigado!!!