使用maven-eclipse-plugin的Maven webapp不会生成<dependent-module> </dependent-module>

时间:2010-04-26 13:12:27

标签: eclipse maven-2 eclipse-wtp

我使用eclipse:eclipse目标来生成Eclipse Project环境。部署工作正常。目标为所有需要的依赖项创建var类路径条目。

使用m2eclipse,Maven容器为我定义了导出文件夹WEB-INF/lib。但我不想依赖m2eclipse所以我不再使用它了。

   

eclipse:eclipse目标生成的类路径条目没有这样的导出文件夹。

在使用WTP引导servlet容器时,它会将除库之外的所有资源和类发布到上下文中。

发布所需的库缺少什么,或者如果没有m2eclipse集成则不可能?

环境

  • Eclipse 3.5 Java EE Galileo
  • Apache Maven 2.2.1(r801777; 2009-08-06 21:16:01 + 0200)
  • Java版本:1.6.0_14
  • <击> m2eclipse的

maven-eclipse-plugin配置

    <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>

生成的文件

执行eclipse:eclipse目标后,依赖模块未列在我生成的.settings/org.eclipse.wst.common.component中,因此在服务器启动时我会错过这些依赖项。

这就是我得到的:

<?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>

即将推出的读者的更新

此处的问题是偏离packaging - 类型,如果您使用maven-eclipse-plugin,请验证<packaging>war</packaging>ear的使用情况。

以下问题标志着我在一个maven pom中有两个构建生命周期的情况。

2 个答案:

答案 0 :(得分:4)

  

发布所需的库缺少什么,或者如果没有m2eclipse集成则不可能?

我不确定是否明白这个问题。我在很长一段时间内成功使用了maven-eclipse-plugin和maven webapps。那么,服务器上的部署是否有效?应用程序是否可用?你能说清楚吗?

为了以防万一,我使用您的插件配置对新创建的webapp进行了快速测试,看起来没问题。我刚删除了jst.java方面并改为配置了maven-compiler-plugin

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

我添加了对log4j的依赖。然后,当我运行mvn eclipse:eclipse时,这就是我在生成的.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>

log4j依赖关系在那里并被发布。我错过了什么?


更新:我将提供的pom粘贴到我的war项目中,将其更改为使用eclipse插件的2.8版并从src/main/webapp中删除resources } element(它不是资源)这是我在运行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>

对我来说很好。

更新2:正如我在对您自己的回答的评论中写的那样,我认为eclipse插件不会为包含类型为{{1}的包装的项目生成动态Web模块}。如果您更改包装jar,它应该按预期运行。我很确定这是你麻烦的原因。

答案 1 :(得分:0)

example pom (on pastie.org)

除了原来的pom.xml之外,我已经删除了约60个依赖项。您只需要创建webapp-archetype并将pom粘贴到生成的(通过archetype命令)

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

eclipse:eclipse导致生成的.settings/org.eclipse.wst.common.component现在显示project-version="2.0"(在我做了1.0到1.5和2.0的各种更改之后),但仍然缺少<dependent-module>

<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>

更新 (@ Pascal Thivent):这是一个好点。我们的项目(一个网络框架)实际上有两个混合的功能。有jar-packaging用于提供框架功能,而运行它会将自身扩展到webapp结构(WEB-INF/...)

但是也应该可以在servlet容器本身上运行带有扩展的框架,因此我们可以开发基本功能而不将其打包为jar并将其与自定义项目一起使用。所以jar在这里是正确的。


更新2

maven-eclipse-plugin的{​​{3}}表明这是硬编码的,除了将packaging设置为war之外,没有办法遇到then子句,或者我是想念什么? :(

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
   }
}