【问题标题】:Building a non-uberjar Docker image with leiningen使用 leiningen 构建非 uberjar Docker 镜像
【发布时间】:2017-06-19 16:03:09
【问题描述】:

我有一个依赖于 Java 库的 clojure 项目,当它被包含在 uberjar 中时,它不起作用。 (它需要不同的 XML 描述符在不同的 JAR 文件中使用相同的文件名。)

我在 leiningen 中使用 Docker 时发现的一切都依赖于构建和打包一个 uberjar。这也是我迄今为止构建所有 clojure Docker 映像的方式。

是否有任何 leiningen 插件可以理解使用 io.fabric8/docker-maven-plugin 等多个 jar 文件打包 Docker 映像?

【问题讨论】:

  • uberjar 是独立于语言的。因此,您可以使用任何构建工具构建一个包含 Clojure 代码的代码。一般来说,我更喜欢 lein 而不是 SBT,但在创建 uberjars 方面,我使用 SBT 插件比使用 lein 插件更成功。例如,在您的情况下,github.com/marcuslonnberg/sbt-docker 可能会对您有所帮助。
  • @ChrisMurphy 感谢您的建议。我的问题是,我正在使用的库在重新打包到 uber-jar 时不起作用。我必须用原始 jar 文件打包我的容器,然后在启动应用程序时在类路径中引用这个 jar。当我手动执行此操作时,它可以工作。当我使用 docker-maven-plugin 打包时它也可以工作,因为这个插件不会重新打包 jar。 maven 的问题是,emacs/cider 不支持 maven。

标签: docker clojure leiningen uberjar


【解决方案1】:

每当打包(uberjar、war)时,创建的大文件都包含 .class 文件和目录结构。这些 XML 文件应该从哪里(类)加载?您可以尝试手动打包。毕竟它(无论是 uberjar、war 还是 jar)只是一个 zip 文件。

当你确切地知道你需要的布局时,SBT 足够灵活,以确保你可以从许多输入的 jar 文件中打包。不幸的是,lein 插件会做一些事情,比如总是覆盖重复,你无法控制打包行为。我不记得确切的不灵活性,但我无法控制包装过程是如何进行的,做出了什么决定。

为了手动操作,我使用了一个名为 Archive Manager 的 Linux,我发现它比我在 Windows 上使用的要好得多。手动操作可能就是您所需要的。 SBT 的缺点当然是你必须学习它,其中包括一些 Scala。

它需要不同的 XML 描述符在不同的 JAR 文件中使用相同的文件名。

考虑一下,是否需要将不同 jar 中的每个文件的内容附加到 uberjar 中的一个文件中?你可以试试看。如果它有效并且您需要经常打包以至于每次手动创建和重命名 zip 文件变得很痛苦,那么我相信 SBT 将是您最好的选择。

我必须用原始jar文件打包我的容器,然后在启动应用程序时在类路径中引用这个jar

类加载器加载类而不是 jar。解包你给它的所有东西是容器的工作,例如 .class 文件、(uber)jars、wars。任何从类路径动态加载的程序都在加载类或资源(如 .xml 文件)。我想 .jar 文件可能是一种资源,在这种情况下,您可以将 jar 文件放在 uberjar 中。所以还是可以打包的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2018-06-19
    • 2020-10-06
    • 2021-11-25
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多