Tomcat WAR,外部JAR

时间:2016-08-27 14:39:08

标签: java maven tomcat jar war

我有一个高度模块化的应用程序,我正在尝试构建并在我脑海中规划它给我一些问题。申请如下。我想创建一系列包含应用程序业务逻辑的JAR文件,A.jarB.jarC.jar

除了这些JAR文件之外,我还希望在动态和每个Jar基础上将它们的每个功能公开给Web。例如,我可能在计算机上有A.jarB.jar,我希望能够将A.warB.war部署到同一台计算机上的Tomcat容器中,其中A.war和B.war只是使用像Spring这样的东西来记录HTTP请求并将这个参数转发到A.jarB.jar

问题

  • 如果由于A.warB.war当时可能不存在而失败,我该如何构建A.jarB.jar
  • 我知道我可以将A.jarB.jar添加到Tomcat的Classpath中,但我怎样才能构建A.warB.war并且基本上只是承诺当他们从中加载类时,他们需要的特定Jar文件会在那里吗?

任何帮助都会非常感激,我现在​​已经是Java开发人员了一段时间,但是直到最近才开始研究类路径成为问题的超级模块化代码。

1 个答案:

答案 0 :(得分:3)

  

我怎样才能构建A.war和B.war,并且基本上只是向他们承诺,当他们从中加载类时,他们需要的特定Jar文件会在那里?

这实际上是Maven依赖项的provided范围的合适案例。来自official documentation

  

provided - 这与compile非常相似,但表示您希望JDK或容器在运行时提供它。它仅在编译和测试类路径中可用,并且不可传递。

也就是说,如果你有multi-module Maven project从中构建A.jar(例如a-lib模块),B.jar(例如b-lib模块),{ {1}}(例如a-war模块)和A.war(例如b-war模块)

B.war

war模块将依赖于库模块,但在范围- project |___a-lib |___b-lib |___a-war |___b-war 中:库将用于编译和测试,但不会打包为war文件的provided文件夹的一部分。但是,它们需要在运行时出现,作为Web容器类路径的一部分。

提供通常用于由主机容器提供(即)开箱即用的库。一个典型的例子是Servlet API库:您的应用程序依赖于它,但它始终由servlet容器(即tomcat)提供。

同样,您可以查看lib范围,以防您实际上真的不想将其用于编译(在war模块中没有直接引用库代码):

  

runtime - 此范围表示编译不需要依赖关系,但是用于执行。它位于运行时和测试类路径中,但不是编译类路径。

运行时作用域通常用于驱动程序(如JDBC驱动程序):您不会(不应该)在代码中直接引用,但在运行时肯定需要。因此,它将成为战争runtime包装的一部分。