我有一个高度模块化的应用程序,我正在尝试构建并在我脑海中规划它给我一些问题。申请如下。我想创建一系列包含应用程序业务逻辑的JAR文件,A.jar
,B.jar
和C.jar
。
除了这些JAR文件之外,我还希望在动态和每个Jar基础上将它们的每个功能公开给Web。例如,我可能在计算机上有A.jar
和B.jar
,我希望能够将A.war
和B.war
部署到同一台计算机上的Tomcat容器中,其中A.war和B.war只是使用像Spring这样的东西来记录HTTP请求并将这个参数转发到A.jar
和B.jar
。
问题:
A.war
和B.war
当时可能不存在而失败,我该如何构建A.jar
和B.jar
? A.jar
和B.jar
添加到Tomcat的Classpath中,但我怎样才能构建A.war
和B.war
并且基本上只是承诺当他们从中加载类时,他们需要的特定Jar文件会在那里吗?任何帮助都会非常感激,我现在已经是Java开发人员了一段时间,但是直到最近才开始研究类路径成为问题的超级模块化代码。
答案 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
包装的一部分。