Re „And (maybe) another Pom.xml (or profile ?)“ in one of your comments to the question:
One of Maven's principles is: one project (declared in a POM), one resulting (main) artifact (JAR, WAR, ...). („main“ since there can be accompanying artifacts like ...-sources.jar
, ...-javadoc.jar
, ...-jar-with-dependencies.jar
, ....zip
, ...)
Maven POMs are of declarative nature. That means, there are no (imperative) if
s to skip declarations on occasion and you also can't add/remove declaration (XML) elements during build (you "just" can add/change element text contents via properties). (There are plugins with a <skip>false|true
parameter, which can be set/overridden with a property, but that's not a general rule and therefore there are not many of them.)
Profiles are a way to overcome this no-if-principle. With them you can activate ("inject") declarations which set or override existing declarations at build time via various profile activation methods.
Regarding your comment after removing the osgi tag, I'm going to update this answer later. In the meantime you can have a look at my answer to Maven: Lifecycle vs. Phase vs. Plugin vs. Goal.
UPDATE
+- 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
jojal main POM
<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] POM Reference, Packaging
[2] POM Reference, Aggregation
Base main POM
<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] POM Reference, Inheritance
A POM
<project ...>
...
<parent>
<groupId>name.jojal.base</groupId>
<artifactId>jojal-base-main</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>project-a</artifactId>
<project>
B POM
<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>
C POM
<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>
Product main POM
<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>
Product 1 POM
<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 Reference, Dependencies
Product 2 POM
<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>
Product 3 POM
<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>
[Please note: Not tested in real, typos possible]