【问题标题】:leiningen uberjar - add external jar at runtimeleiningen uberjar - 在运行时添加外部 jar
【发布时间】:2023-03-03 16:43:01
【问题描述】:

我正在尝试查看在制作 leiningen uberjar 时如何将目录和外部 jar 添加到类路径中。

原因是我需要分发一个jar,但是由于许可限制,某些依赖项(例如jdbc驱动程序)无法编译到uberjar中。

我还想提供某些外部资源,例如 jar 外部的日志记录和配置属性。

通常在 java 或 spring boot 中,我会使用适当的命令行选项来更改类路径。但是 -cp 找不到 jar 等

有没有办法做到这一点或合适的插件? 提前致谢

【问题讨论】:

    标签: clojure leiningen uberjar


    【解决方案1】:

    您可以将 jar 作为资源添加到 :dev 配置文件中。然后将其添加到类路径中。 dev 配置文件用于本地开发,未打包到 uberjar 中。

    :profiles {
             :uberjar {:aot :all}
             :dev {:resource-paths ["no-redist/commercial-jdbc-driver.jar"]}}
    

    在使用 uberjar “生产”时,您需要手动设置类路径:

    java -cp no-redist/commercial-jdbc-driver.jar;your-app-uber-jar.jar main.namespace
    

    Afaik 在使用 -jar 标志时,它使用 jar 文件中的依赖关系,无论那里链接和引用的任何内容。组合 -cp 和 -jar 可能不起作用。

    另一种方法是引用jar清单中的不可分发的jar文件(META-INF/MANIFEST.MF):

    Class-Path: no-redist/commercial-jdbc-driver.jar
    

    java -jar your-app-uber-jar.jar 会在本地目录的 no-redist/commercial-jdbc-driver.jar 文件夹中查找 jar。像这样在 leinigen 中添加:

    :manifest {"Class-Path" "no-redist/commercial-jdbc-driver.jar"}
    

    【讨论】:

    • 我明白这一点,但我的主要问题是如何让 uberjar 看到商业驱动程序。每当我放罐子时,它都看不到它。如果我使用 -cp 选项,这似乎被引导加载程序忽略,并且我得到类未找到错误。与我要求在类路径上的资源类似 - 它似乎没有在 uberjar 之外寻找任何东西
    • 更新了答案以提供更多关于使用不可再发行 jar 运行 uberjar 的详细信息
    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2011-09-18
    • 2021-10-24
    相关资源
    最近更新 更多