我正在一个多模块Maven项目中转换一个Eclipse Maven管理的webapp项目(这是一个试验Maven的测试项目,所以随时提供任何建议)。
单个项目webapp没有任何错误,在部署时成功编译并正确运行,所以我从一个正在运行的应用程序开始。
应用程序有一个Web部件和一个控制台部分,这意味着有一些带有main()
方法的类,当从Eclipse中运行时(使用Run as - > Java Application)按预期工作。这两个部分都显示数据库中的数据,可以直接通过JDBC或jOOQ查询。
所以,这是我分割项目的方式:
main()
方法的类); 在Eclipse中,我现在有4个独立的项目:
shaker-multi
拥有聚合器(和父级)POM,以及子目录中的每个模块; shaker-multi-core
; shaker-multi-runnable
; shaker-multi-webapp
。在Eclipse内部,核心和 webapp 编译,后者可以部署到Tomcat实例,我可以在浏览器中看到它。
问题出现在 runnable 上。该项目依赖于jOOQ类,因此必须生成相关的源代码。 jOOQ依赖关系和配置在core/pom.xml
中(因为它们也可以在那里使用)。
当我做项目时 - >运行方式 - > Maven build ... - > clean generate-sources
,shaker-multi-core
我得到:
Non-resolvable parent POM: Failure to find sunshine.web:shaker-multi:pom:0.0.1
这听起来很合理,因为即使在我的本地存储库中,我也没有安装任何这些工件。
但是当我打电话给Maven时...... - > shaker-multi
上的“干净安装”,因为无法找到web.xml
的{{1}}文件而中断(虽然它正确位于shaker-multi-webapp
中)。
我该怎么办? 我的项目配置/拆分完全错了吗? 我应该在父POM中添加另一个模块吗?这听起来不对,因为POM参考声明:
继承和聚合通过单个高级POM创建一个很好的动态来控制构建。 您经常会看到父项和聚合器项目。
我完全迷失在这里。
我的期望:
shaker-multi-webapp/src/main/webapp/WEB-INF/web.xml
上运行Maven package
并获得可部署的战争; shaker-multi-webapp
上运行Maven package
并获取命令行runnable jar (我仍然需要配置其POM以生成jar-with-dependencies,但我知道); shaker-multi-runnable
上运行Maven package
并获取某种捆绑,我可以随身携带,它将包含 war 或 jar 每个模块。修改
我添加了
shaker-multi
到 <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
POM,如this answer所示,但没有区别。
修改-2
我清除了整个本地存储库(如建议here),当我重新打开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** [...]
任何提示?它来自哪里?我不能重现它(不再删除我的整个本地回购)。
这是shaker-multi-webapp
POM:
shaker-multi
这是<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>
POM:
shaker-multi-core
这是<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>
POM:
shaker-multi-webapp
答案 0 :(得分:2)
我假设你的文件夹结构是这样的:
+-- shaker-multi
+--- pom.xml
+--- shaker-multi-core
+-- pom.xml
+--- shaker-multi-runnable
+-- pom.xml
+--- shaker-multi-webapp
+-- pom.xml
此外,您应该检查您的项目是否在命令上正常工作 Eclipse中的 NOT 。所以你应该去你的项目的根目录 (shaker-multi文件夹)和
mvn clean package
这不会产生任何错误等。
我想到的一件事是你为什么要使用发行版而不是
适合您项目的SNAPSHOT版本。那么0.0.1
代替0.0.1-SNAPSHOT
?
你应该改进的是maven-compiler插件的定义 在你的父母:
<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>
我建议这样做:
<build>
<pluginManagement>
<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>
</pluginManagement>
</build>
<project>
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
</project>
以上将定义许多插件的默认值,如maven-compiler-plugin, maven-resources-plugin等。
<dependencies>
<dependency>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi-core</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<!-- JSP & Servlet dependencies -->
</dependency>
</dependencies>
我建议定义这样的模块间依赖关系:
<dependencies>
<dependency>
<groupId>sunshine.web</groupId>
<artifactId>shaker-multi-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<!-- JSP & Servlet dependencies -->
</dependency>
</dependencies>
答案 1 :(得分:0)
这里的整个问题非常简单,我觉得有点惭愧:但是我第一次做多模块项目时,我想这可能会发生。
当然,当您自己使用所有项目和模块资源时,此处的详细信息仍然存在:如果您是团队成员,仅处理项目的一部分和/或使用集中式私有存储库,然后是YMMV。
首先,在将单个项目拆分为多个模块之后,这就是我的Eclipse Project Explorer中的情况:
+-- shaker-multi
^--- pom.xml
^--- shaker-multi-core
^-- pom.xml
^-- (other content)
^--- shaker-multi-runnable
^-- pom.xml
^-- (other content)
^--- shaker-multi-webapp
^-- pom.xml
^-- (other content)
+-- shaker-multi-core
^-- pom.xml
+-- shaker-multi-runnable
^-- pom.xml
+-- shaker-multi-webapp
^-- pom.xml
每个+--
都是一个单独的Eclipse项目。其中每一个都是从SVN中单独检出的(事实上它们彼此分离)。
然后,我在+-- shaker-multi-runnable
中编辑了一些内容,并希望在+-- shaker-multi
上运行Maven时能够正常工作,而不需要svn-提交前者并对后者进行svn更新。
这就是我在这个问题上不断收到错误的原因!
处理此类项目的正确方法,如果它们来自最初的整体项目,那么:
接下来,进入IDE的SVN Repositories
选项卡,使用现在拆分的项目展开存储库,然后执行父项目的签出为Maven项目(将模块作为子文件夹)
如果您和我一样使用最新版本的Subclipse,那么您需要Maven Eclipse (m2e) SCM connector for subclipse 1.10 (svn 1.8) - update site(感谢转到buluschek development,查看该帖子的最新评论),以便您可以从签出Maven项目对话框中选择存储库路径。
有了它,你告诉Eclipse从父文件夹和Eclipse自动检出整个项目:
这一点(4)是关键所在:虽然有几个项目,但是它们已经链接在一起(我想在手动检出每个模块文件夹时也可以这样做,虽然我不知道如何)。
完成此操作后,我失去了所有Maven问题。