I used InteliJ and I didn't like that it doesn't really understand
project structure and especially profiles. NB works with maven to figure
out dependencies and you can use profiles to share build groups with
other devs.
For example here you have a full build and a utils build that can be
built separately (not always great, but it works good enough in NB):
<?xml version="1.0" encoding="UTF-8"?>
<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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pl.myproject</groupId>
<artifactId>myproject</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>myproject</name>
<modules>
<module>myproject-core</module>
<module>myproject-saas</module>
<module>myproject-utils</module>
<module>myproject-dwh</module>
<module>myproject-lms-client</module>
<module>myproject-extapp</module>
<module>myproject-opac</module>
</modules>
<profiles>
<!-- default -->
<profile>
<id>full</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>myproject-core</module>
<module>myproject-saas</module>
<module>myproject-lms-client</module>
<module>myproject-extapp</module>
<module>myproject-aash</module>
<module>myproject-utils</module>
<module>myproject-dwh</module>
<module>myproject-opac</module>
</modules>
</profile>
<!-- UTILS -->
<profile>
<id>utils-build-only</id>
<properties>
<skip.integration.tests>true</skip.integration.tests>
<skip.unit.tests>true</skip.unit.tests>
</properties>
<modules>
<module>myproject-saas</module>
<module>myproject-utils</module>
</modules>
</profile>
<profile>
<id>utils-development</id>
<properties>
<skip.integration.tests>true</skip.integration.tests>
</properties>
<modules>
<module>myproject-saas</module>
<module>myproject-utils</module>
</modules>
</profile>
<profile>
<id>utils-full</id>
<modules>
<module>myproject-saas</module>
<module>myproject-utils</module>
</modules>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.0</version>
<configuration>
<release>17</release>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.24.3</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Blake McBride (2025-09-18 22:42):
According to ChatGPT:
If you have *multiple source roots*, Maven itself only supports a
*single* |<sourceDirectory>| and |<testSourceDirectory>| in the
|<build>| section. To handle *more than one*, you need to *declare one
as the “main”* and then use the |build-helper-maven-plugin| to add the
rest.
This is one of many reasons I resorted to my own build system.
(BTW, IntelliJ supports any number of source roots.)
--blake