有点像Maven的双向依赖,还是我只是感到困惑?
我正在尝试将一个包含多个子模块的项目转换为Maven,但我想我对如何正确地执行有点困惑 这是一款带有有点像Maven的双向依赖,还是我只是感到困惑?,maven,pom.xml,dependency-management,m2e,circular-dependency,Maven,Pom.xml,Dependency Management,M2e,Circular Dependency,我正在尝试将一个包含多个子模块的项目转换为Maven,但我想我对如何正确地执行有点困惑 这是一款带有war包装的webapp。这是我们的项目结构: core(带spring、hibernate等) module1 module2 模块3 每个模块都依赖于核心,因为核心提供了数据库访问和一些基本功能。用Maven的话来说,我会 <dependency> <groupId>a.b.c</groupId> <artifactId>core&l
war
包装的webapp。这是我们的项目结构:
(带spring、hibernate等)core
module1
module2
模块3
模块
都依赖于核心
,因为核心
提供了数据库访问和一些基本功能。用Maven的话来说,我会
<dependency>
<groupId>a.b.c</groupId>
<artifactId>core</artifactId>
</dependency>
在模块3的内部pom.xml
在这里之前,一切看起来都很平直和正常,我想(?)现在让人困惑的是:
核心是webapp。因此,在最后,我将编译
项目核心
- 这些
模块将为webapp提供一些额外的功能
- 这意味着:
在某种程度上取决于每个core
模块
- 这意味着:
- 未来的版本可能不包含
,而是包含module2
,它实际上继承了module2b
的类,但可以添加/覆盖某些功能module2
核心项目中的模块。该文件的内容告诉Spring再扫描几个包以查找控制器和bean
此外,还有一个Ant任务,它处理文件系统路径:
<path id="libs.projects">
<dirset dir="${basedir}/../.">
<include name="libprefix*"/>
<exclude name="moduleprefix*"/>
</dirset>
</path>
它扫描以libprefix
和moduleprefix
开头的文件夹并编译它们。之后,它从目标目录和一些其他文件(html、jsp、js、css等)获取生成的jar
文件,并将它们复制到核心项目目录中
问题很清楚,我认为:
- 最佳的项目布局是什么(特别是关于那些未来的版本)
- 双向项目依赖是正确的方法吗
也许还有其他方法可以将Maven父模块与pom
打包一起使用?我以前从未使用过它,也不知道它的功能。但我希望你们知道如何解决这个问题;)
谢谢大家! 在Maven中,如果您想让您的未来变得简单,您将让每个Maven项目生成一件事。一罐。一场战争。随便一个
将现有项目转换为Maven时,这很少容易。问题不在于Maven,而在于可能从未组织过依赖结构的现有项目。它可能已经与依赖于其他部件子部件的部件相互缠绕,等等。它可能看起来是循环的,但这通常只是因为没有以一种有用的方式正确地分析和细分位。现有的项目可能有点像我的车库。我能找到任何东西,但我确实无法向其他人描述它是如何组织的。这可能适用于车库或小型单人项目,但对于代码执行有价值服务的大型项目,这并不合适。Maven让你很难让它杂乱无章。任何构建工具在组织时都可以使用它
我认为,根据你所说的,你不是在做一个项目/一个工件的事情:
“core”包含模块使用的共享代码,“core”是webapp(听起来它可能有两个用途。)
有一个Ant任务生成一个jar并将其复制到核心项目(jar应该由核心依赖的自己的项目创建)
一些可能的解决办法
- Ant任务需要是自己的项目,生成自己的jar文件,而核心项目依赖于该jar
- 还有另一个war项目,它收集各种模块中生成的JAR以及创建web应用程序的核心
- 如果您对模块2b的讨论意味着有另一个版本的web应用程序使用模块2b而不是模块2,那么您可能需要多个war项目
- 如果您在继续使用模块2b时退出使用模块2,那么关于模块2b的讨论可能会通过模块版本控制得到解决
它必须被重新考虑为一个顶级工件(可能是一场战争),它依赖于一些较低级别的工件(可能是模块jar和核心jar)。然后,这些较低级别的工件依赖于其他较低级别的工件。一切都可以依赖第三方罐子。听起来不错。所以如果我理解正确的话:一个带有spring(和web工具)的war
项目,它依赖于具有hibernate的jar
项目数据库。然后,每个模块
将取决于数据库
项目。而war
项目将取决于所有需要的模块
。。。然后,如果我们希望应用程序的第二个版本具有不同的配置,我们将创建第二个war
项目,这取决于所需的所有模块。对吗?但还有一件事要做:每个模块
都有自己的实体
和dao
。这意味着它们必须包含在persistence.xml
中。但是我不想把它们包括在数据库项目中。数据库项目应该在其他模块中查找这些类。这可能吗?这是否有帮助:
<path id="libs.projects">
<dirset dir="${basedir}/../.">
<include name="libprefix*"/>
<exclude name="moduleprefix*"/>
</dirset>
</path>