Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有点像Maven的双向依赖,还是我只是感到困惑?_Maven_Pom.xml_Dependency Management_M2e_Circular Dependency - Fatal编程技术网

有点像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

我正在尝试将一个包含多个子模块的项目转换为Maven,但我想我对如何正确地执行有点困惑

这是一款带有
war
包装的webapp。这是我们的项目结构:

  • core
    (带spring、hibernate等)
  • module1
  • module2
  • 模块3
每个
模块
都依赖于
核心
,因为
核心
提供了数据库访问和一些基本功能。用Maven的话来说,我会

<dependency>
  <groupId>a.b.c</groupId>
  <artifactId>core</artifactId>
</dependency>
在模块3的内部
pom.xml


在这里之前,一切看起来都很平直和正常,我想(?)现在让人困惑的是:

  • 核心是webapp。因此,在最后,我将编译
    核心
    项目
  • 这些
    模块将为webapp提供一些额外的功能
    
    • 这意味着:
      core
      在某种程度上取决于每个
      模块
  • 未来的版本可能不包含
    module2
    ,而是包含
    module2b
    ,它实际上继承了
    module2
    的类,但可以添加/覆盖某些功能
目前,我们有一个属性(和一个额外的xml)文件,其中包含
核心
项目中的
模块。该文件的内容告诉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>