代码之家  ›  专栏  ›  技术社区  ›  James McMahon

如何使用maven2将多个模块和第三方jar捆绑在一个zip中?

  •  2
  • James McMahon  · 技术社区  · 15 年前

    我正在使用Maven2将我的应用程序开发为一组OSGi包。一些常见的功能,例如日志记录、Web服务器等,是从其他OSGi包中使用的,例如,我使用的是Jetty的OSGi版本。

    我想将我的应用程序与所有第三方捆绑包和一个OSGi容器一起装运。我选择 Apache Felix 作为我的默认容器。

    我对Maven很陌生,我不知道如何编写执行此操作的POM文件,并且在 Maven book . 核心点似乎是一个多模块项目不会创建自己的工件。

    它确实按照应该的方式将我的包构建并打包成与OSGi兼容的JAR文件(使用 maven-bundle-plugin )现在,我希望它也能包装其他东西(不需要构建或任何东西,只需将其拉入并放入包中),并生成这样的zip文件:

    +-Archive Root
     |
     +- /bundles
      |
      +- my.bundle1.jar
      +- my.bundle2.jar
      +- 3rd.party.bundle1.jar
      +- 3rd.party.bundle2.jar
     +- /conf
      |
      +- ... some config files ...
     +- felix.jar
    

    这样,我的用户可以下载zip文件,将其解包到一个目录中,说“myapp”,然后转到

    # > java -jar /path/to/MyApp/felix.jar
    

    一些关于细节的注释,如果它们重要:

    • 每个包都是没有自己的源代码和 packaging 设置为“pom”,如本书示例所示。
    • 我已经决定不将Felix嵌入到一个中心包中(“托管框架”方法)
    • 我可以为运行OSGi容器的客户提供一个包含我自己捆绑包的备选装运方式。这可能是一个起点?
    2 回复  |  直到 15 年前
        1
  •  2
  •   James McMahon    15 年前

    我花了一段时间(大约读了半天的医生书)才意识到我所寻找的简单答案是:

    使用 Maven Assemblies .

    它们实际上让您从项目的工件和依赖项中收集各种各样的存档。

        2
  •  2
  •   Rich Seller    15 年前

    在您引用的文档中,有一个标题为 嵌入依赖项 这描述了插件如何解析Maven项目依赖项并将它们添加到类路径和资源中。

    该插件使用该指令将项目依赖项转换为和子句,然后将它们附加到当前的一组指令中并传递到bnd。如果希望嵌入的依赖项位于或中间,则可以使用maven dependencies,它将自动扩展到相关子句。

    该插件使用该指令将项目依赖项转换为和子句,然后将它们附加到当前的一组指令中并传递到bnd。如果希望嵌入的依赖项位于或中间,则可以使用maven dependencies,它将自动扩展到相关子句。

    在下面的示例中,maven dependencies占位符将扩展为包含范围运行时的项目依赖项,或编译为include resource和bundle classpath元素。

    <!-- embed all compile and runtime scope dependencies -->
    <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
    
    <Include-Resource>
      {maven-resources},{maven-dependencies}
    </Include-Resource>
    
    <Bundle-ClassPath>.,{maven-dependencies},some.jar</Bundle-ClassPath>
    

    通常,插件只检查直接依赖项,但可以通过以下选项将其更改为包含完整的可传递依赖项集:

    <Embed-Transitive>true</Embed-Transitive>
    

    如果需要内联依赖项而不是嵌入依赖项,请添加inline=true。例如,要内联所有编译和运行时范围的依赖项,请使用:

    <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>