有没有办法为具有相同基础但模块化的不同客户端构建一个项目,以便在运行时发现某些功能?



我习惯于使用 E4 Eclipse 框架来构建桌面应用程序,现在我想迁移到一个简单的 maven 项目。

在带有OSGi的Eclipse平台中,有一个捆绑包,功能和产品的概念。

当我想为客户 A 构建我的项目时,我有一个描述所有依赖项的文件 A.product。对于客户端 B,我有 B.产品等。

当然,我的软件共享相同的基础,但是如果客户想要新功能(如插件),我必须将其添加到我的产品文件中,新功能将在运行时被发现并呈现给我的软件。

在 maven 中,我找不到做同样事情的好方法,因为只有一个 pom.xml描述整个项目。如何为运行时发现的插件引入模块化?
我应该为每个客户端有多个POM吗? 我应该使用配置文件来执行此操作吗?我试过了,但我不容易管理。

有没有另一种 maven 好方法可以做到这一点,并轻松管理可变性?

Re ">和(也许)另一个Pom.xml(或个人资料?)"在你对这个问题的评论之一中:

Maven的原则之一是:一个项目(在POM中声明),一个生成的(主)工件(JAR,WAR,...)。("主要",因为可以有伴随的工件,如...-sources.jar...-javadoc.jar...-jar-with-dependencies.jar....zip,...

Maven POM 具有声明性。这意味着,有时没有(命令式)if跳过声明,并且您也不能在构建过程中添加/删除声明 (XML) 元素(您"只是"可以通过属性添加/更改元素文本内容)。(有些插件带有<skip>false|true参数,可以用属性设置/覆盖,但这不是一般规则,因此数量不多。

配置文件是克服这种无假设原则的一种方法。使用它们,您可以激活("注入")声明,这些声明通过各种配置文件激活方法在构建时设置或覆盖现有声明。

关于您在删除osgi标签后的评论,我稍后将更新此答案。同时,你可以看看我对Maven的回答:生命周期vs.阶段vs.插件vs.目标。

更新

+- jojal-main
+- pom.xml   ... contains declarations common for all of your projects
+- base-main
+- pom.xml   ... contains declarations common for all base projects
+- A
+- src/main/java/your/package/Plugin.java
+- pom.xml
+- B
+- src/main/java/your/package/ClassA.java   ... implements Plugin
+- pom.xml
+- C
+- src/main/java/your/package/ClassB.java   ... implements Plugin
+- pom.xml
+- product-main
+- pom.xml   ... contains declarations common for all product projects
+- product1
+- src/main/java/your/package/Product1.java   ... references A & B
+ pom.xml
+- product2
+- src/main/java/your/package/Product2.java   ... references A & C
+- pom.xml
+- product3
+- src/main/java/your/package/Product3.java  ... references A & B & C
+- pom.xml

乔哈尔主聚甲醛

<project ...>
...
<groupId>name.jojal</groupId>
<artifactId>jojal-main</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>  <!-- different to the default 'jar'[1] -->
<modules>  <!-- to build projects in sub-dirs at once[2] -->
<module>base-main</module>
<module>product-main</module>
</modules>
... declarations common for all of your projects like dependencies for unit testing, logging etc. ..
<project>

[1] 聚甲醛参考,包装>[2] 聚甲醛参考,聚合

基础主聚甲醛

<project ...>
...
<parent>   <!-- declarations are inherited from this parent POM[3] -->
<groupId>name.jojal</groupId>
<artifactId>jojal-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>jojal-base-main</artifactId>  <!-- <groupId>, <version> can be omitted if the same as in parent -->
<packaging>pom</packaging>
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
</modules>
... declarations common for all base projects ...
<project>

[3]聚甲醛参考,继承

聚甲醛

<project ...>
...
<parent>
<groupId>name.jojal.base</groupId>
<artifactId>jojal-base-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

<artifactId>project-a</artifactId>
<project>

乙聚甲醛

<project ...>
...
<parent>
<groupId>name.jojal.base</groupId>
<artifactId>jojal-base-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>project-b</artifactId>
<dependencies>
<dependency>
<groupId>name.jojal.base</groupId>
<artifactId>project-a</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<project>

聚甲醛

<project ...>
...
<parent>
<groupId>name.jojal.base</groupId>
<artifactId>jojal-base-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

<artifactId>project-c</artifactId>
<dependencies>
<dependency>
<groupId>name.jojal.base</groupId>
<artifactId>project-a</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<project>

产品主打聚甲醛

<project ...>
...
<parent>
<groupId>name.jojal</groupId>
<artifactId>jojal-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>jojal-product-main</artifactId>
<packaging>pom</packaging>
<modules>
<module>product1</module>
<module>product2</module>
<module>product3</module>
</modules>
... declarations common for all product projects ...
<project>

产品 1 聚甲醛

<project ...>
...
<parent>
<groupId>name.jojal.product</groupId>
<artifactId>jojal-product-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>product-1</artifactId>
<dependencies>
<dependency>
<groupId>name.jojal.base</groupId>
<artifactId>project-b</artifactId>  <!-- project-a is resolved automatically by Maven
as a transitive dependency[4] -->
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<project>

[4]POM 参考,依赖

关系

产品 2 聚甲醛

<project ...>
...
<parent>
<groupId>name.jojal.product</groupId>
<artifactId>jojal-product-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>product-2</artifactId>
<dependencies>
<dependency>
<groupId>name.jojal.base</groupId>
<artifactId>project-c</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<project>

产品 3 聚甲醛

<project ...>
...
<parent>
<groupId>name.jojal.product</groupId>
<artifactId>jojal-product-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>product-3</artifactId>
<dependencies>
<dependency>
<groupId>name.jojal.base</groupId>
<artifactId>project-b</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>name.jojal.base</groupId>
<artifactId>project-c</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<project>

[请注意:未经过真实测试,可能有错别字]

最新更新