【问题标题】:Can I add a directory containing a jar and its dependant jars as a maven dependency?我可以添加一个包含 jar 及其依赖 jar 的目录作为 maven 依赖项吗?
【发布时间】:2020-06-02 15:34:28
【问题描述】:

我正在开发一个小型代码库(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 向这样的包添加“正确”依赖项,以便以后可以构建一个 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: ...

【问题讨论】:

  • 没有。您可以添加具有系统范围的依赖项,但除了单独添加它们之外,没有简单的方法来处理传递依赖项。您可能应该避免这种情况,因为它与特定系统的构建密切相关。
  • 这是一个 OSGi 项目,它处理的事情完全不同。
  • OSGi 真的有必要吗?
  • 不适合我,但不幸的是我无法控制这个库的创建者以哪种形式提供(和构建)它。我也不知道 OSGi 以及如何将它集成到我的 maven 项目中。
  • 对于编辑器:我的问题并不是真正的传递依赖,我可以接受它们在上述结构中的样子。但是,我正在寻找一种一种简单的方法来将此结构作为一个整体集成到我的 maven 项目中。

标签: java maven osgi


【解决方案1】:

Manifest 告诉你这个库的 jar 包含依赖项。如果您将此库 jar 安装到 OSGi 中,它应该可以工作,因为它嵌入了所有依赖项。

如果你打算在 OSGi 之外使用这个库,那么这种与嵌入式库的打包是没有意义的。也许他们也只提供库,您可以通过 maven 安装依赖项(如果它们是众所周知的开源库)。

【讨论】:

    【解决方案2】:

    如@Christian Schneider 所述,直接从公共 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 生成校验和。

    【讨论】:

      猜你喜欢
      • 2015-07-12
      • 2019-09-03
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多