依赖性问题,我们都处理过,但是我大多数时候都习惯C#,现在在Java中工作,所以我有一些疑问。
假设我向我的项目添加了一个名为ExtLib
的库。ExtLib
的lib
文件夹中包含一个特定的库,我们称它为LogLib-1.0
。
我正在使用Eclipse
,并且为User Library
制作了ExtLib
,包括其主jar文件以及其lib
文件夹中的所有文件。到目前为止,一切都很好。
但是现在我想做一些自己的日志记录,因此我制作了另一个User Library
并向其中添加更新的LogLib-1.1
,因为它具有一些我想使用的新功能。
我能确定我不会以这种方式破坏ExtLib
吗?
我知道.NET使用Global Assembly Cache和类似的方法,但是我不知道Java如何处理它。我尝试了Googling,但没有发现太多,在这里和那里都提到了Classloader,但没有任何帮助。
谁能告诉我解决这个问题的正确方法是什么?还是根本没有问题?
最佳答案
在这种特定情况下(LogLib-1.0和LogLib-1.1),我们将处理同一个库,该库既是应用程序的直接依赖项,又是通过ExtLib的“传递”依赖项。在这种情况下,依赖性管理可以提供帮助。
LogLib-1.1可能是LogLib-1.0的向后兼容版本,这可能会决定您的应用程序只能使用LogLib-1.1才能正常运行。
在Java世界中,存在诸如Maven,Gradle或SBT之类的工具来帮助您。 Maven是最广泛使用的,其他工具通常也与Maven兼容。
用法
要使用Maven解决这种情况,您可以在应用程序中添加一个名为pom.xml
的文件,说明该文件取决于LogLib版本1.1。可能看起来像这样(请注意,此示例是纯小说):
<dependency>
<groupId>org.loglib</groupId>
<artifactId>loglib</artifactId>
<version>1.1</version>
</dependency>
您使用的ExtLib也附带有pom.xml,它可能会指出
<dependency>
<groupId>org.loglib</groupId>
<artifactId>loglib</artifactId>
<version>1.0</version>
</dependency>
Maven(或任何其他工具)会认为包括LogLib-1.1足以使您的应用程序运行。使用Maven时,
mvn depedency:tree
可帮助您可视化。部署方式
关于打包/部署问题:
mvn package
会将您的应用程序打包到一个jar
,war
或ear
存档中,仅包括您需要的依赖项(而不是同一lib的两个版本)。这使您不必担心应用程序服务器读取jar文件的顺序。