- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个多模块项目,其中每个模块都使用 Apache Felix maven-bundle-plugin 打包为一个 OSGi 包。整个项目是使用列出上述模块的父 POM 构建的。某些模块包含配置资源(例如 .properties 文件),不应将其放入 bundle 中进行部署,而应将其外部化在专用的配置文件夹中。我的目标是创建一个如下所示的分发文件夹(可能是一个 zip 文件):
my-app-distribution
/bundles
module1-bundle.jar
module2-bundle.jar
etc.
/conf
external1.properties
external2.properties
etc.
/conf
目录下的属性文件是从各个模块的 /target
文件夹中精心挑选的文件。 .properties
文件需要从目标文件夹而不是 src 文件夹中获取的原因是我正在使用 Maven 资源过滤,并且 source 属性文件包含 ${..}
环境特定值的占位符。这些占位符在构建过程中被正确解析 - 每个构建配置文件 - 并且 target/
文件夹包含实际的特定于环境的值。
我已经做过很多次这样的分发文件操作 - 对于带有可执行 JAR 的分发等。在这种情况下,我想使用程序集描述符的“moduleSets”配置 - 很容易将所有二进制文件/jar 拉到一个使用 moduleSet/binary 描述符的单个分发文件夹。在 maven-bundle-plugin 中也很容易将某些文件排除在打包到 OSGi 包中之外。我遇到的唯一问题是创建 /conf
分发文件夹并在那里收集必要的属性文件。我试图在“moduleSet/sources”描述符中使用“fileSets”来仅包含来自每个模块的 **/target
的特定文件,但这似乎不起作用。
有人有建议吗?必须有一个简单的方法。或者我根本不应该使用?
谢谢,
简历
@PetrKozelka 我不确定将特定于不同包的配置文件提取到单独的模块中是个好主意。 OSGi 的全部要点是 bundle 是独立的并且可能是可重用的——在开发和分发中都是如此。只有在源代码中将功能实现和相关配置文件组合在一起才有意义。对于特定的发行版,我可能需要提取一些文件——如果管理员需要控制某些参数。对于不同的发行版/应用程序,这可能会有所不同。程序集配置可能会更改,但包/源将保持不变。此外,每个 bundle 都可能单独开发和使用,并非所有 bundle 都必须始终属于同一个 super 项目——正如您所假设的那样。您的建议似乎属于按 Artifact 类型(例如“模型”、“服务”、“数据访问”、“配置”等)打包企业应用程序的旧类别,而不是按功能域/功能。这种方法在单个应用程序/项目中工作正常,但在企业级别上失败,因为企业级别通常需要重用垂直组件的子集(按功能域划分)。
对于您依赖于模块中的文件布局的观点,我同意不应该存在这种依赖性。可以根据非常具体的发行版要求,通过明确的名称或命名约定来手动挑选文件。 (这正是我面临的情况。)
最佳答案
我实际上已经想出了如何或多或少优雅地做到这一点。在下面发布解决方案,以防其他人正在寻找解决类似问题的方法。
总结
我正在使用 maven-assembly-plugin
从各个模块中提取二进制文件(捆绑 JAR)并将它们打包在 <my-distribution-folder>/bundles
中目录。在每个应该外部化一些资源文件的模块中,我将这些文件合并到 /src/main/resources/external
下目录,并使用 maven-resources-plugin
在打包阶段将这些资源复制到我专用的自动生成目录 distribution
包含 assembly.xml
的模块描述 rune 件,也作为顶级项目的一部分构建。我用 maven-clean-plugin
在父 POM 中,在顶级项目构建的 CLEAN 阶段清除分发暂存目录的内容。
MAVEN 配置
在包含需要外部化资源的每个包的模块 POM 中,我添加了以下资源管理配置:
<build>
<defaultGoal>install</defaultGoal>
<!--
enable resource filtering for resolving ${...} placeholders with environment-specific values
exclude any files that must be externalized
-->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>external/*.*</exclude>
</excludes>
</resource>
</resources>
...
<plugins>
<!-- Copies contents of resources/external to dedicated folder defined by property in parent -->
<!-- externalized resources will be packaged according to assembly instructions -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>
${project.parent.basedir}/${externalizableResourcesStageDir}
</outputDirectory>
<resources>
<resource>
<directory>src/main/resources/external</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<!-- builds a JAR file for this bundle -->
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
<Import-Package>*</Import-Package>
<Export-Package>
${project.groupId}.thismodulepackage*;version=${project.version}
</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
哪里externalizableResourcesStageDir
是在顶层/父 POM 中定义的属性。在项目中,我包含了一个具有以下结构的特殊分发模块:
distribution
/ext-resources (target auto-generated dir for external resources from modules)
/src
/assemble
assembly.xml (assembly descriptor)
assembly.xml
文件看起来像这样:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<!-- generate a ZIP distribution -->
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<baseDirectory>/</baseDirectory>
<moduleSets>
<moduleSet>
<!-- Enable access to all projects in the current multi-module build -->
<useAllReactorProjects>true</useAllReactorProjects>
<!-- select projects to include-->
<includes>
<include>myGroupId:myModuleArtifactId1</include>
<include>myGroupId:myModuleArtifactId2</include>
...
</includes>
<!-- place bundle jars under /bundles folder in dist directory -->
<binaries>
<outputDirectory>${artifactId}/bundles</outputDirectory>
<unpack>false</unpack>
</binaries>
</moduleSet>
</moduleSets>
<!-- now take files from ext-resources in this module and place them into dist /conf subfolder-->
<fileSets>
<fileSet>
<directory>ext-resources</directory>
<outputDirectory>${artifactId}/conf/</outputDirectory>
<includes>
<include>*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
分发模块的 POM 如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>myGroupId</groupId>
<artifactId>parentArtifactId</artifactId>
<version>...</version>
</parent>
<groupId>myGroupId</groupId>
<artifactId>distribution</artifactId>
<version>...</version>
<packaging>pom</packaging>
<name>Distribution</name>
<description>This module creates the <MyProject> Distribution Assembly</description>
<url>http:...</url>
<!-- NOTE: These dependency declarations are only required to sort this project to the
end of the line in the multi-module build.
-->
<dependencies>
<dependency>
<groupId>myGroupId</groupId>
<artifactId>myModuleArtifactId1</artifactId>
<version>${project.version}</version>
</dependency>
...
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>dist-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/assemble/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
父 POM 将列出所有捆绑模块,加上分发模块,并定义程序集插件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>myGroupId</groupId>
<artifactId>myParentId</artifactId>
<version>...</version>
<packaging>pom</packaging>
<properties>
...
<!-- directory where build may place any sub-modules' resources that should be externalized -->
<!-- those resources may be picked up by maven-assembly-plugin and packaged properly for distribution -->
<externalizableResourcesStageDir>
esb-distribution/ext-resources
</externalizableResourcesStageDir>
</properties>
<!-- all project modules (OSGi bundles + distribution) -->
<modules>
<module>bundle-module1</module>
<module>bundle-module2</module>
...
<module>distribution</module>
</modules>
<dependencyManagement>
<dependencies>
...
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<!--
Cleans contents of the folder where the externalized resources will be consolidated
Each module adds its own external files to the distribution directory during its own build
-->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>clean-ext-resources</id>
<phase>clean</phase>
</execution>
</executions>
<configuration>
<filesets>
<fileset>
<directory>${externalizableResourcesStageDir}</directory>
<includes>
<include>*.*</include>
</includes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<descriptors>
<descriptor>src/assemble/assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
注意:我们还确保将外部化资源文件排除在打包到单独的包 JAR 中(参见模块 POM 的 resources
部分。)生成的解压缩分发将如下所示:
my-app-distribution
/bundles
module1-bundle.jar
module2-bundle.jar
etc.
/conf
external1.properties
external2.properties
etc.
关于maven - 使用 maven-assembly-plugin 生成 OSGi 包分发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13203566/
我目前正在为一组非常异构的计算机开发 OpenCL 应用程序(具体使用 JavaCL)。为了最大限度地提高性能,如果 GPU 可用,我想使用它,否则我想回退到 CPU 并使用 SIMD 指令。我的计划
我尝试使用以下链接为我的示例应用程序创建 OTA: http://developer.apple.com/library/ios/#featuredarticles/FA_Wireless_Enter
使用 gradle 发行版插件创建发行版时是否可以添加空目录(例如“日志”)? 我看到了this JIRA ,描述完全相同的事情。仍然开放https://issues.gradle.org/brows
我在网上看到,如果我们想将应用程序分发到应用程序商店,我们需要一个单独的分发配置文件。我知道 StackOverflow 上已经有针对此错误的答案,但我认为我的答案与我的分发配置文件有关。 所以现在我
我想为 existing bundle id 创建新的 IOS Provisioning profile 但它给我一个错误。请帮忙 我创建同名的IOS 但管理员做了一些事情并使其无效。现在他为我创建了
要么我疯了,要么没有人喜欢/喜欢这个功能,但很久以前我曾经在 sourceforge 系统中使用 subversion。我有能力为完成的提交创建完整的文件补丁。 无论如何,我无法弄清楚如何在 git
以不需要客户手动安装 Ruby 和所需 Gem 的方式向客户分发简单的命令行 Ruby 应用程序的最佳方式是什么? 根据我的理解,这个任务归结为几行 SH/BAT 代码,这些代码执行 Ruby/Gem
我有一个依赖于多个库的 Java 项目,这些库作为 JAR 文件分发。当我构建我的项目时,我最终得到了 myProject.jar 和一个 lib 文件夹,其中包含我使用的每个库的 JAR 文件。 为
编辑:更新了问题,因为我很困惑 .dist-id与 .id ; 我正在尝试卸载 dist,但是当我通过 Distribution 时至 .uninstall看起来它的计算方式不同 .dist-id和
我正在考虑移动一个当前嵌入 Python 解释器的程序以使用 Lua。使用 Python 相当容易使用 modulefinder , compileall , 和 zipfile制作一个包含所有使用的
我的老板想要为特定客户分发该应用程序,该客户的员 worker 数约为 500 人。该应用程序使用 Web 服务和设备的 UDID 来限制其他用户访问该软件。我们不是一个可以注册企业程序的大公司,尤其
我正在使用临时分发来运行 Beta 测试程序,并且在分发应用程序更新时遇到了一些问题。我能够通过临时分发在设备上获取应用程序更新的唯一方法是先从设备中删除应用程序,然后安装更新。这为 Beta 测试人
我的公司最近开始为各种客户开发定制 iPhone 应用程序。我们遇到的挑战之一是如何将这些应用程序提供给客户,以便他们可以在开发过程中对其进行审查。 理想情况下,只需向他们发送应用程序文件并让他们将其
我正在使用 SDWebImage 开源项目来异步加载图像。我可以为模拟器以及我的本地设备构建和运行。但是,当我尝试构建分发(即存档)时,编译器似乎不理解头文件是什么: 导入“UIImageView+W
我的应用程序依赖于 DBGHELP.DLL 函数,尤其是有关目标进程加载的 DLL 的信息。然而,很多时候它在低于 Vista 的 Windows 版本上失败(你知道 XP 仍然存在!)。环顾四周,发
tl;博士 大约一周前,我为我的第一个重要的 Haskell 项目发布了 0.1.0.0 包。我希望可执行文件易于安装和升级,即使对于非 Haskellers 也是如此。在 the README 中,
我刚刚完成 Erlang 实践截屏视频(代码 here ),并且有一些关于分发的问题。 这是整体架构: 以下是监督树的样子: 阅读Distributed Applications让我相信主要动机之一是
我是 iPhone 世界的新手。 我开发了一个应用程序,我想将其发送到特定 wi-fi 接入点附近的所有 iphone。 (它适用于购物中心) 据我所知,由于我在这方面的知识有限,我无法通过我的网络服
我使用 Netbeans 创建了一个 Java 控制台应用程序。在 Netbeans dist 目录中,我有该项目的类文件。现在我需要将可执行文件提供给其他人谁将在另一台电脑上运行它们。 我应该发送哪
我正在考虑使用 IronPython 开发一个小型应用程序,但是我想将我的应用程序分发给非技术人员,因此理想情况下我希望能够为他们提供我的应用程序的标准快捷方式以及他们需要的说明首先安装 IronPy
我是一名优秀的程序员,十分优秀!