Pergunta

I'm new to Maven. I have a multi-module maven 2 project that has the following structure (somewhat simplified):

Project (POM packaging)
  |
  +-- Module1 (JAR)
  |     |
  |     +-- src
  |          |
  |          +-- main
  |               |
  |               +-- java
  |               +-- resources
  |
  +-- Module2 (JAR)
  |      |
  |     ...
  |
  +-- Web Module (WAR)
         |
        ...

I've configured the Web Module to include the Maven Jetty plugin. This works great for building the production artifacts. For development, I discovered that I need to call mvn install on any module that I change, followed by stoping jetty and calling jetty:run again.
It would be much more productive if there was a way for the plugin to pick changes directly from each module's target directories. According to the jetty plugin documentation there seems to be such a feature, but it appears this only applies to the WAR module.
Even more important to me is to be able to make changes to resource files, without the need to restart jetty. That's because most of the resources are HTML template files, and it's enormously more productive to design and update the templates during development without needing to restart to see the changes.

So, is there a way to set the classpath of the jetty plugin to include the target/classes and resources directories of each JAR module, instead of the actual JARs in the local repository?

Thanks!
Yaniv

Foi útil?

Solução

This isn't possible with a multi-module Maven project. A cardinal rule of Maven projects is that each project should be able to stand alone. That doesn't preclude them from being built together, but any one project should be able to be built by itself so long as all it's dependencies are satisfied.

In this case, it means that the WAR project cannot look out to the other projects to see if they need to be updated, the POM for those other projects are the definitive declaration of what needs to be done to build the artifact. And once the artifact is built, it is put in the local repository. There is no association between the source files and the artifact at that point, so there's no way to tell what source files would trigger a rebuild of the artifact that the WAR depends on.

Outras dicas

In Eclipse, you can use "Run Jetty" plugin to achieve this.
In IDEA's Run Configuration, there is an option 'Resolve Workspace artifacts', check it.

If you use M2Eclipse (Eclipse plug-in for a close integration of Maven within Eclipse), you can run your jetty:run goal in the web module and other dependencies will be taken into account from your workspace, even if they are not at all available in your local repository.

There is just an option in your run to tell Maven to resolve your modules in the workspace itself (by default, it would just fetch what is deployed in the local repository).

Unfortunately, I cannot have the same behaviour in IDEA and I have to run an install before running the jetty:run on the web module.

Based on this answer:Best practice wrt. `mvn install`, multi-module projects, and running one submodule a workaround around Mavens horrible restrictions and reactor limitations is to define the plugin in the parent pom with skip true, and then reenable it in the respective submodule using skip false.

I solved by using a maven launcher and configuring Resolve Workspace artifacts, that is not checked by default enter image description here

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top