WTP is a very promising eclipse extension, that seems to have been very well though from the ground up, and from my point of view gives you better control than myEclipse (what I have been using so far).
It took me about a day to be able to use wtp 0.7rc2 with my maven projects. I couldn't find any relevant up to date documentation but some bugzilla entries and some outdated test plans. I am writing this post to not forget what I have been doing so far.
Basically a maven project is a project with the following features:
- separation of sources by topic java, test, webapp
- usage of external libraries with a variable (MAVEN_REPO)
- eclipse project dependency where needed (<eclipse.dependency>true</eclipse.dependency>)
[ArtifactId] will denote the current project name as per maven standards
This is still a very manual process, hopefully either the eclipse maven plugin or the mevenide eclipse plugin will be enabled to generate/edit/synchronize those configuration files.
Setup: eclipse 3.1 + wtp 0.7 RC2 or RC3
Of course you also need to install EMF/GEF/JEM plugins. I highly recommend installing in an extension directory (a directory with an eclipse subfolder and an empty file named .eclipseextension), so it is easy to switch versions and update to the latest version without having to reinstall eclipse from scratch.
I have two kind of projects, libraries and webapps. Libraries are used by webapps. This setup looks exactly like what is described by Integrating existing maven projects in WTP and by Flexible project test plan. But following those instructions written for WTP-M3 won't work with the current release of WTP.
I assume the projects are already setup as standard eclipse projects and compiling. To edit configuration files, you should switch to the resource perspective and disable "build automatically".
Step 1: setup the library projects
Edit .project there should be 3 builders in the following order:
- org.eclipse.wst.common.modulecore.ComponentStructuralBuilder
- org.eclipse.jdt.core.javabuilder
- org.eclipse.wst.common.modulecore.ComponentStructuralBuilderDependencyResolver
- org.eclipse.jdt.core.javanature
- org.eclipse.wst.common.modulecore.ModuleCoreNature
Create a .wtpmodules file that contains the following code
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId">
<wb-module name="[artifactId]">
<module-type module-type-id="jst.utility"/>
<wb-resource path="/"/>
</wb-module>
</project-modules>
<project-modules id="moduleCoreId">
<wb-module name="[artifactId]">
<module-type module-type-id="jst.utility"/>
<wb-resource path="/"/>
</wb-module>
</project-modules>
Step 2: setup the webapps
Edit .project and add the following builders
- org.eclipse.wst.common.modulecore.ComponentStructuralBuilder
- org.eclipse.jdt.core.javabuilder
- org.eclipse.wst.validation.validationbuilder
- org.eclipse.wst.common.modulecore.ComponentStructuralBuilderDependencyResolver
- org.eclipse.wst.common.modulecore.DependencyGraphBuilder
- org.eclipse.jem.workbench.JavaEMFNature
- org.eclipse.jst.j2ee.web.WebNature
- org.eclipse.jdt.core.javanature
- org.eclipse.wst.common.modulecore.ModuleCoreNature
Create a file .wtpmodules which reads
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId">
<wb-module deploy-name="[artifactId]">
<module-type module-type-id="jst.web">
<version>2.3</version>
<property name="context-root" value="[artifactId]"/>
<property name="java-output-path" value="/bin/"/>
</module-type>
<wb-resource source-path="/src/java" deploy-path="/WEB-INF/classes"/>
<wb-resource source-path="/src/webapp" deploy-path="/"/>
<dependent-module deploy-path="/WEB-INF/lib"
handle="module:/resource/[libArtifactId]/[libArtifactId]">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module deploy-path="/WEB-INF/lib"
handle="module:/classpath/var/MAVEN_REPO/[groupId]/jars/[artifactId]-[version].jar"/>
</wb-module>
</project-modules>
<project-modules id="moduleCoreId">
<wb-module deploy-name="[artifactId]">
<module-type module-type-id="jst.web">
<version>2.3</version>
<property name="context-root" value="[artifactId]"/>
<property name="java-output-path" value="/bin/"/>
</module-type>
<wb-resource source-path="/src/java" deploy-path="/WEB-INF/classes"/>
<wb-resource source-path="/src/webapp" deploy-path="/"/>
<dependent-module deploy-path="/WEB-INF/lib"
handle="module:/resource/[libArtifactId]/[libArtifactId]">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module deploy-path="/WEB-INF/lib"
handle="module:/classpath/var/MAVEN_REPO/[groupId]/jars/[artifactId]-[version].jar"/>
</wb-module>
</project-modules>
The handle protocol is as follow:
- classpath is a classpath reference, the second item on the path can be lib or var (as the kind attribute in the .classpath file)
- resource is an eclipse flexible project reference, the second item being the project name, and the third item a module within the project. dependency-type can be uses which build the jar for you or consumes which copy the files across.
You can now enable "automatic building", and your webapp should be assembled in the .deployables directory. You can then rigth-click your webapp project icon and Run it on the server of your choice.
This is a very error prone process, as there is no error or warning if you provide a broken .wtpmodules file.
Any comments appreciated.