依赖性问题,我们都处理过,但是我大多数时候都习惯C#,现在在Java中工作,所以我有一些疑问。

假设我向我的项目添加了一个名为ExtLib的库。
ExtLiblib文件夹中包含一个特定的库,我们称它为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会将您的应用程序打包到一个jarwarear存档中,仅包括您需要的依赖项(而不是同一lib的两个版本)。这使您不必担心应用程序服务器读取jar文件的顺序。

10-08 07:05