多模块项目的Maven依赖范围

时间:2013-09-08 07:59:59

标签: java maven

我正处于java项目的初始阶段(使用maven的jsp / servlet项目)。这是一个多模块项目。我正在使用maven。 现在说有3个模块。

模型,控制器和Web模块 model需要mysql lib
controller使用model,扩展并使用模型的类 web需要controllermodel两个模块。

我已将mysql添加到模型的依赖项中,模型已添加到controller模块的依赖项中,controller已添加到web模块中depencency。 (我是否需要将model模块添加到web模块的依赖项?)

我如何/应该如何配置这些模块的依赖关系范围?

编辑:结构

Root
 |
 |---Model  *dependencies:mysqllib/compile*
 |
 |---Controller *dependencies:Model/compile*
 |
 |---Web  *dependencies:Controller/compile*

所有内容都设置为complie范围 我在web模块中有一个.jsp文件(默认为jsp),
这个jsp调用控制器模块内部类的静态方法Account.getAccount()

JSP代码

<%=xy.controller.Account.getAccount()%>

在浏览器中打开jsp文件时,我在浏览器中遇到异常
错误堆栈

    org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 8 in the jsp file: /index.jsp
xy.controller.AccountH cannot be resolved to a type
5:     <title></title>
6:   </head>
7:   <body>
8:                        <%=xy.controller.Account.getAccount()%>
9:   </body>
10: </html>


Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:331)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:469)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

pom文件中的依赖关系
- 控制器 - pom

<dependency>
            <groupId>xy</groupId>
            <artifactId>model</artifactId>
            <version>0.0.1</version>
            <scope>compile</scope>
        </dependency>
  • web - pom
<dependency>
            <groupId>xy</groupId>
            <artifactId>controller</artifactId>
            <version>0.0.1</version>
            <scope>compile</scope>
        </dependency>

2 个答案:

答案 0 :(得分:3)

项目可以使用当前项目及其祖先中的所有依赖项。

Root  *dependencies:libA*
 |
 |---Model  *dependencies:mysqllib*
 |
 |---Controller *dependencies:Model*
 |
 |---Web  *dependencies:Model,Controller*

要回答您的问题:,如果您具有上述结构,则需要将模型显式添加到Web模块的依赖关系列表中。请注意,libA可供所有3个模块访问,但mysqllib仅适用于Model。

您可以使用父子关系来决定如何构建项目。

答案 1 :(得分:0)

根据@mihi的评论

  

你确定你的问题是依赖吗?控制器需要   “罐子”和网络的包装是“战争”的包装,你必须这样做   要么先mvn安装控制器在mvn打包web之前,要么有   包含'pom'的父pom,它们都列为模块。还有,我   假设您部署了由'package'命令构建的war文件,并且   你的战争中没有任何“提供”的范围?检查你的   战争中的WEB-INF / lib如果libs那里也可能存在   有用...

添加'war'的包装并添加'pom'包装的父pom解决了这个问题。 谢谢@mihi。