我可以添加一个包含 jar 及其依赖 jar 的目录作为 Maven 依赖项吗?
Can I add a directory containing a jar and its dependant jars as a maven dependency?
我正在开发一个小型代码库(maven 项目),它需要与我的项目集成的系统的创建者提供的库。现在该库采用以下形式:
com.example.library.client_1.2.3.v20190123/ (just a directory)
├── lib/
│ ├── some-dependency-3.2.1.jar
│ ├── ....jar
│ └── another-dependency-1.2.3.jar
├── META-INF/
│ └── MANIFEST.MF
└── some.library.jar
这个图书馆是如何建造的?
如何使用 Maven 向此类包添加 "proper" 依赖项,以便稍后构建 big/uber jar?我知道用一个罐子有几种方法,例如我可以使用 mvn install:install-file ...
将它安装到我的本地存储库。但是我怎样才能将上述结构添加为依赖项以将库包含在 lib
目录中(传递依赖项)?我可以重新打包上述结构以便更好地使用吗?
我是否需要将所有这些 lib
jar 分别添加到我的本地 Maven 存储库?
如果感兴趣,清单具有以下形式:
Manifest-Version: 1.0
Bundle-SymbolicName: com.example.library....;singleton:=true
Export-Package: com.example.library...
Bundle-Name: ...
Bundle-Version: 1.2.3.v20190123
Bundle-ClassPath: lib/some-dependency-3.2.1.jar,lib/...
.jar,lib/another-dependency-1.2.3.jar
Bundle-ManifestVersion: 2
Bundle-ActivationPolicy: lazy
Bundle-Vendor: ...
Manifest 告诉您这个库的 jar 包含依赖项。如果将此库 jar 安装到 OSGi 中,它应该可以工作,因为它嵌入了所有依赖项。
如果您打算在 OSGi 之外使用这个库,那么这种带有嵌入式库的打包就没有意义了。也许他们也只提供库,您可以通过 maven 安装依赖项(如果它们是众所周知的开源库)。
如@Christian Schneider 所述,直接从 public maven 存储库安装清单文件中提到的所有依赖项。那些不可用的可以手动安装到项目范围内的项目本地 maven 存储库。为此,请在您的父 pom.xml
文件中定义项目内 Maven 存储库:
<repositories>
<repository>
<id>in-project</id>
<name>In Project Repo</name>
<url>file://${project.basedir}/lib</url>
</repository>
</repositories>
然后安装库 some.library.jar
和清单中列出的依赖项,这些依赖项未对项目内存储库公开可用:
mvn install:install-file \
-Dfile=path/to/some-library-1.2.3.jar \
-DgroupId=com.example \
-DartifactId=some-library \
-Dversion=1.2.3 \
-Dpackaging=jar \
-DlocalRepositoryPath=lib \
-DcreateChecksum=true
这将在您的本地 maven 存储库 (lib
) 中生成结构,并生成 maven 的校验和。
我正在开发一个小型代码库(maven 项目),它需要与我的项目集成的系统的创建者提供的库。现在该库采用以下形式:
com.example.library.client_1.2.3.v20190123/ (just a directory)
├── lib/
│ ├── some-dependency-3.2.1.jar
│ ├── ....jar
│ └── another-dependency-1.2.3.jar
├── META-INF/
│ └── MANIFEST.MF
└── some.library.jar
这个图书馆是如何建造的?
如何使用 Maven 向此类包添加 "proper" 依赖项,以便稍后构建 big/uber jar?我知道用一个罐子有几种方法,例如我可以使用 mvn install:install-file ...
将它安装到我的本地存储库。但是我怎样才能将上述结构添加为依赖项以将库包含在 lib
目录中(传递依赖项)?我可以重新打包上述结构以便更好地使用吗?
我是否需要将所有这些 lib
jar 分别添加到我的本地 Maven 存储库?
如果感兴趣,清单具有以下形式:
Manifest-Version: 1.0
Bundle-SymbolicName: com.example.library....;singleton:=true
Export-Package: com.example.library...
Bundle-Name: ...
Bundle-Version: 1.2.3.v20190123
Bundle-ClassPath: lib/some-dependency-3.2.1.jar,lib/...
.jar,lib/another-dependency-1.2.3.jar
Bundle-ManifestVersion: 2
Bundle-ActivationPolicy: lazy
Bundle-Vendor: ...
Manifest 告诉您这个库的 jar 包含依赖项。如果将此库 jar 安装到 OSGi 中,它应该可以工作,因为它嵌入了所有依赖项。
如果您打算在 OSGi 之外使用这个库,那么这种带有嵌入式库的打包就没有意义了。也许他们也只提供库,您可以通过 maven 安装依赖项(如果它们是众所周知的开源库)。
如@Christian Schneider 所述,直接从 public maven 存储库安装清单文件中提到的所有依赖项。那些不可用的可以手动安装到项目范围内的项目本地 maven 存储库。为此,请在您的父 pom.xml
文件中定义项目内 Maven 存储库:
<repositories>
<repository>
<id>in-project</id>
<name>In Project Repo</name>
<url>file://${project.basedir}/lib</url>
</repository>
</repositories>
然后安装库 some.library.jar
和清单中列出的依赖项,这些依赖项未对项目内存储库公开可用:
mvn install:install-file \
-Dfile=path/to/some-library-1.2.3.jar \
-DgroupId=com.example \
-DartifactId=some-library \
-Dversion=1.2.3 \
-Dpackaging=jar \
-DlocalRepositoryPath=lib \
-DcreateChecksum=true
这将在您的本地 maven 存储库 (lib
) 中生成结构,并生成 maven 的校验和。