我正在将单个 Eclipse Maven 管理的 webapp 项目转换为多模块 Maven 项目(这是一个用于试验 Maven 的测试项目,因此请随意提供任何类型的建议)。
单个项目 Web 应用程序没有任何错误,成功编译并在部署时正常运行,因此我从一个工作应用程序开始。
该应用程序有一个 Web 部分和一个控制台部分,这意味着有一些类带有main()
当从 Eclipse 中运行时(使用 Run as -> Java Application)按预期工作的方法。这两部分都显示来自数据库的数据,直接通过 JDBC 或通过jOOQ http://www.jooq.org/.
所以,这就是我分割项目的方式:
-
core(包含其他两个部分共有的所有内容);
-
runnable(包含具有
main()
方法);
-
webapp(网络应用程序部分)。
在 Eclipse 中,我现在有 4 个独立的项目:
-
shaker-multi
保存聚合器(和父级)POM,以及子目录中的每个模块;
-
shaker-multi-core
;
-
shaker-multi-runnable
;
-
shaker-multi-webapp
.
在日食内部,core and webapp编译,后者可以部署到Tomcat实例中,我可以在浏览器中看到它。
问题的出现是runnable。该项目依赖于 jOOQ 类,因此必须生成相关源代码。 jOOQ 依赖项和配置位于core/pom.xml
(因为它们也可能在那里使用)。
当我执行 Project -> Run As -> Maven build... ->clean generate-sources
, on shaker-multi-core
I get:
Non-resolvable parent POM: Failure to find sunshine.web:shaker-multi:pom:0.0.1
这听起来很合理,因为我没有安装任何这些工件,即使在我的本地存储库中也是如此。
但是当我调用 Maven build... -> 'clean install' 时shaker-multi
,它会因为找不到web.xml
归档shaker-multi-webapp
(尽管它正确地驻留在shaker-multi-webapp/src/main/webapp/WEB-INF/web.xml
).
我应该怎么办?
我的项目配置/拆分完全错误吗?
我应该在父 POM 中添加另一个模块吗?这听起来是错误的,因为 POM 参考声明:
继承和聚合创建了一个很好的动态来通过单个高级 POM 控制构建。您经常会看到既是父项目又是聚合器的项目.
我完全迷失在这里了。
我的期望:
- run
Maven package
on shaker-multi-webapp
并获得可部署的war;
- run
Maven package
on shaker-multi-runnable
并获得可运行的命令行jar(不过,我知道,我仍然需要配置其 POM 来生成带有依赖项的 jar);
- run
Maven package
on shaker-multi
并获得某种bundle我可以四处走动并且包含war or the jar每个模块的。
EDIT
I added
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
to shaker-multi-webapp
POM,如所示这个答案 https://stackoverflow.com/a/5353693/3127111,但没有区别。
EDIT-2
我清除了整个本地存储库(按照建议here http://www.coderanch.com/t/550433/tools/Error-assembling-WAR-webxml-attribute),当我重新打开 Eclipse 时,在 Maven 控制台中我看到
[...]
05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/main/java
05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/test/java
**05/09/14 07:58:19 CEST: [ERROR] Could not read web.xml**
[...]
有什么提示吗?它从哪里来?但我无法重现它(无需再次删除我的整个本地存储库)。
This is shaker-multi
POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<modules>
<module>shaker-multi-core</module>
<module>shaker-multi-runnable</module>
<module>shaker-multi-webapp</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
This is shaker-multi-core
POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
</parent>
<artifactId>shaker-multi-core</artifactId>
<packaging>jar</packaging>
<build>
<plugins>
<plugin><!-- jOOQ plugin--></plugin>
</plugins>
</build>
<dependencies>
<dependency><!-- jOOQ dependency --></dependency>
</dependencies>
</project>
This is shaker-multi-webapp
POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi</artifactId>
<version>0.0.1</version>
</parent>
<artifactId>shaker-multi-webapp</artifactId>
<packaging>war</packaging>
<build>
<plugins>
<plugin><!-- Tomcat local -->
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi-core</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<!-- JSP & Servlet dependencies -->
</dependency>
</dependencies>
</project>