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!