用leiningen建立一个非uberjar Docker图像

时间:2017-02-02 14:22:40

标签: docker clojure leiningen uberjar

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

我在使用Docker和leiningen时发现的一切都取决于构建和包装uberjar。这也是我到目前为止构建所有clojure Docker图像的方式。

是否有任何leiningen插件,它能理解使用像io.fabric8 / docker-maven-plugin这样的几个jar文件打包Docker镜像吗?

1 个答案:

答案 0 :(得分:0)

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

当您确切知道布局时,您需要SBT足够灵活,以确保您可以从许多输入jar文件打包。不幸的是,lein插件会执行诸如始终覆盖重复项之类的操作,并且您无法控制打包行为。我无法记住确切的不灵活性,但我无法控制包装过程的进展,做出了哪些决定。

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

  

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

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

  

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

类加载器加载类而不是jar。解包您提供的所有东西是容器的工作,例如.class文件,(超级)罐子,战争。从类路径动态加载的任何程序都在加载类或资源(如.xml文件)。我想.jar文件可能是一个资源,在这种情况下你会把jar文件放在uberjar中。所以它仍然可以打包它。