Christopher Klewes
Christopher Klewes

Reputation: 11445

Maven webapp with maven-eclipse-plugin doesn't generate <dependent-module>

I use the eclipse:eclipse goal to generate an Eclipse Project environment. The deployment works fine. The goal creates the var classpath entries for all needed dependencies.

With m2eclipse there was the Maven Container which defines an export folder which was WEB-INF/lib for me. But i don't want to rely on m2eclipse so i don't use it anymore.

the class path entries which are generated by eclipse:eclipse goal don't have such a export folder.

While booting the servlet container with WTP it publishes all resources and classes except the libraries to the context.

Whats missing to publish the needed libs, or isn't that possible without m2eclipse integration?

Enviroment

The maven-eclipse-plugin configuration

    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-eclipse-plugin</artifactId>
     <version>2.8</version>
     <configuration>
      <projectNameTemplate>someproject-[artifactId]</projectNameTemplate>
      <useProjectReferences>false</useProjectReferences>
      <downloadSources>false</downloadSources>
      <downloadJavadocs>false</downloadJavadocs>

      <wtpmanifest>true</wtpmanifest>
      <wtpversion>2.0</wtpversion>
      <wtpapplicationxml>true</wtpapplicationxml>
      <wtpContextName>someproject-[artifactId]</wtpContextName>

      <additionalProjectFacets>
        <jst.web>2.3</jst.web>
      </additionalProjectFacets>
     </configuration>
    </plugin>

The generated files

After executing the eclipse:eclipse goal, the dependent-module is not listed in my generated .settings/org.eclipse.wst.common.component, so on server booting i miss the depdencies.

This is what i get:

<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
  <wb-module deploy-name="someproject-core">
    <wb-resource deploy-path="/" source-path="src/main/java"/>
    <wb-resource deploy-path="/" source-path="src/main/webapp"/>
    <wb-resource deploy-path="/" source-path="src/main/resources"/>
  </wb-module>
</project-modules>

Update for upcoming readers

The problem here was the deviant packaging-type, if u use maven-eclipse-plugin please validate the use of <packaging>war</packaging> or ear.

The following problems are marked of the situations that i have two build-lifecycles in one maven pom.

Upvotes: 9

Views: 12142

Answers (2)

Pascal Thivent
Pascal Thivent

Reputation: 570595

Whats missing to publish the needed libs, or isn't that possible without m2eclipse integration?

I'm not sure to understand the problem. I've used the maven-eclipse-plugin with maven webapps during a long time with success. So, does the deployment on a Server work or not? Is the application usable or not? Can you clarify?

Just in case, I did a quick test on a newly created webapp with your plugin configuration which looks ok. I just removed the jst.java facet and configured the maven-compiler-plugin instead:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <target>1.5</target>
    <source>1.5</source>
  </configuration>
</plugin>

And I added a dependency on log4j. Then, when I run mvn eclipse:eclipse, this is what I get in the generated .settings/org.eclipse.wst.common.component:

<project-modules id="moduleCoreId" project-version="2.0">
  <wb-module deploy-name="example-mvn-Q2713648">
    <property name="context-root" value="example-mvn-[artifactId]"/>
    <wb-resource deploy-path="/" source-path="src/main/webapp"/>
    <property name="java-output-path" value="/target/classes"/>
    <dependent-module archiveName="log4j-1.2.14.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar">
      <dependency-type>uses</dependency-type>
    </dependent-module>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
  </wb-module>
</project-modules>

The log4j dependency is there and gets published. What did I miss?


Update: I pasted the provided pom in my war project, changed it to use the version 2.8 of the eclipse plugin and removed src/main/webapp from the resources element (it's not a resource) and this is what I get when running mvn eclipse:eclipse:

<project-modules id="moduleCoreId" project-version="2.0">
  <wb-module deploy-name="example-mvn-Q2713648">
    <property name="context-root" value="example-mvn-[artifactId]"/>
    <wb-resource deploy-path="/" source-path="src/main/webapp"/>
    <property name="java-output-path" value="/target/classes"/>
    <dependent-module archiveName="hsqldb-1.8.0.10.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/hsqldb/hsqldb/1.8.0.10/hsqldb-1.8.0.10.jar">
      <dependency-type>uses</dependency-type>
    </dependent-module>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
  </wb-module>
</project-modules>

Looks fine to me.

Update 2: As I wrote in a comment to your own answer, I don't think the eclipse plugin will generate a dynamic web module for a project with a packaging of type jar. If you change the packaging war, it should behave as expected. I'm pretty sure this is the cause of your troubles.

Upvotes: 4

Christopher Klewes
Christopher Klewes

Reputation: 11445

The example pom (on pastie.org)

I've removed ~60 dependencies from the original pom.xml beside this nothing changed. You just have to create the webapp-archetype and paste the pom into the generated (by the archetype command)

mvn archetype:create 
     -DgroupId=example 
     -DartifactId=mvn 
     -DarchetypeArtifactId=maven-archetype-webapp

After this eclipse:eclipse leads to the generated .settings/org.eclipse.wst.common.component which now shows project-version="2.0" (after i did various changes from 1.0 to 1.5 and 2.0) but still the <dependent-module> is missing.

<project-modules id="moduleCoreId" project-version="2.0">
  <wb-module deploy-name="example-mvn-mvn">
    <wb-resource deploy-path="/" source-path="src/main/webapp"/>
    <wb-resource deploy-path="/" source-path="src/main/resources"/>
  </wb-module>
</project-modules>

Update (@Pascal Thivent): This is a good point. Our project (a web-framework) has in fact two mixed features. There is the jar-packaging which is used to provide the framework capabilities, while running it expands itself into the webapp-structure (WEB-INF/...)

But it should also be possible to run the framework with its extensions on a servlet container itself, so we can develop the base functionality without package it as jar and use it with a custom project. So the jar is correct here.


Update 2

The source code (EclipseWtpComponentWriter) of the maven-eclipse-plugin shows that this is hardcoded and there is no way to run into the then clause except setting the packaging to war, or did i miss something? :(

private void writeModuleTypeComponent( XMLWriter writer, String packaging,
                 File buildOutputDirectory, EclipseSourceDir[] sourceDirs, 
                 ArtifactRepository localRepository)
{
   if ( Constants.PROJECT_PACKAGING_WAR.equalsIgnoreCase( packaging ))
   { 
       // Adding the <dependent-modules> stuff
   }
}

Upvotes: 0

Related Questions