Skip to content

Commit 2bfcc97

Browse files
committed
finish modularity
1 parent fa7b021 commit 2bfcc97

27 files changed

Lines changed: 115 additions & 151 deletions

File tree

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ CI checks enforce those conventions too, so be sure to build your project with M
9191
./mvnw clean install
9292
```
9393

94-
For information about how to set up code style checks in your IDE, see [IDE Setup Instructions](https://github.com/TimefoldAI/timefold-solver/blob/main/build/ide-config/ide-configuration.adoc).
94+
For information about how to set up code style checks in your IDE, see [IDE Setup Instructions](build/ide-config/ide-configuration.adoc).
9595

9696
**Key code style conventions** (see [Constitution](.specify/memory/constitution.md) for complete details):
9797
- Automatic formatting via Maven build

build/build-parent/pom.xml

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,6 @@
6060
<!-- Plugin configuration properties -->
6161
<maven.min.version>3.9.11</maven.min.version> <!-- The same as the version in .mvn/maven-wrapper.properties -->
6262
<maven.compiler.release>21</maven.compiler.release>
63-
<!-- This property needs to be defined in all modules that use the packaging 'jar'.
64-
It is used by different plugins to make sure the module/bundle names are consistent. -->
65-
<java.module.name/>
6663
<spotless.skip>false</spotless.skip>
6764
<spotless.goal>apply</spotless.goal>
6865
<!-- JaCoCo coverage data file location -->
@@ -369,16 +366,6 @@
369366
<artifactId>maven-jar-plugin</artifactId>
370367
<version>${version.jar.plugin}</version>
371368
<executions>
372-
<execution>
373-
<id>default-jar</id>
374-
<configuration>
375-
<archive>
376-
<manifestEntries combine.children="append">
377-
<Automatic-Module-Name>${java.module.name}</Automatic-Module-Name>
378-
</manifestEntries>
379-
</archive>
380-
</configuration>
381-
</execution>
382369
<execution>
383370
<id>test-jar</id>
384371
<goals>

build/ide-config/ide-configuration.adoc

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
= IDE code style setup
1+
= Configuring your IDE for Timefold Solver
2+
3+
== Running tests in your IDE
4+
5+
Timefold Solver is https://en.wikipedia.org/wiki/Java_Platform_Module_System[a modular project].
6+
However, its test coverage runs on the classpath, not the module path.
7+
Maven respects this and runs the tests on the classpath, but IDEs don't always do that by default.
8+
If you're running your tests in the IDE and seeing errors about missing modules,
9+
you need to configure your IDE to run the tests on the classpath.
10+
11+
== IDE code style setup
212

313
Every Maven build formats the source code with the standard code style.
414
This avoids merge conflicts and code style discussions.
515

616
Configure it in your favorite IDE too:
717

8-
== IDEA setup
18+
=== IDEA setup
919

1020
. Open the _Settings_ window (or _Preferences_ depending on your edition) and navigate to _Plugins_.
1121

@@ -26,7 +36,7 @@ file in the `build/ide-config/src/main/resources/` directory.
2636

2737
. Open the _Editor -> Code Style -> Java -> Imports_ settings and set the _Class count to use import with '\*'_ to 999. This is to avoid the `*` imports, which should only be used in special cases.
2838

29-
== Eclipse setup
39+
=== Eclipse setup
3040

3141
. Open the _Preferences_ window, and then navigate to _Java -> Code Style -> Formatter_.
3242

@@ -36,7 +46,7 @@ file in the `build/ide-config/src/main/resources/` directory.
3646

3747
. Click Import and select the `build/ide-config/src/main/resources/eclipse.importorder` file.
3848

39-
== VS Code setup
49+
=== VS Code setup
4050

4151
. Open the _Extensions_ window (Ctrl+Shift+X) and search for _Language Support for Java(TM)_ and install it.
4252

build/ide-config/pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,4 @@
2020
</description>
2121
<url>https://solver.timefold.ai</url>
2222

23-
<properties>
24-
<java.module.name>ai.timefold.solver.ide.config</java.module.name>
25-
</properties>
26-
2723
</project>

core/pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@
2222
</description>
2323
<url>https://solver.timefold.ai</url>
2424

25-
<properties>
26-
<java.module.name>ai.timefold.solver.core</java.module.name>
27-
</properties>
28-
2925
<dependencies>
3026

3127
<!-- Gizmo dependencies -->

core/src/main/java/module-info.java

Lines changed: 98 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,65 @@
11
module ai.timefold.solver.core {
2+
3+
// Public APIs
4+
exports ai.timefold.solver.core.api.domain.common;
5+
exports ai.timefold.solver.core.api.domain.entity;
6+
exports ai.timefold.solver.core.api.domain.solution;
7+
exports ai.timefold.solver.core.api.domain.solution.cloner;
8+
exports ai.timefold.solver.core.api.domain.valuerange;
9+
exports ai.timefold.solver.core.api.domain.variable;
10+
exports ai.timefold.solver.core.api.function;
11+
exports ai.timefold.solver.core.api.score;
12+
exports ai.timefold.solver.core.api.score.analysis;
13+
exports ai.timefold.solver.core.api.score.stream;
14+
exports ai.timefold.solver.core.api.score.stream.common;
15+
exports ai.timefold.solver.core.api.score.stream.uni;
16+
exports ai.timefold.solver.core.api.score.stream.bi;
17+
exports ai.timefold.solver.core.api.score.stream.tri;
18+
exports ai.timefold.solver.core.api.score.stream.penta;
19+
exports ai.timefold.solver.core.api.score.stream.quad;
20+
exports ai.timefold.solver.core.api.score.calculator;
21+
exports ai.timefold.solver.core.config.solver;
22+
exports ai.timefold.solver.core.config.solver.random;
23+
exports ai.timefold.solver.core.config.solver.monitoring;
24+
exports ai.timefold.solver.core.config.solver.termination;
25+
exports ai.timefold.solver.core.config.heuristic.selector.entity;
26+
exports ai.timefold.solver.core.config.heuristic.selector.entity.pillar;
27+
exports ai.timefold.solver.core.config.heuristic.selector.list;
28+
exports ai.timefold.solver.core.config.heuristic.selector.move;
29+
exports ai.timefold.solver.core.config.heuristic.selector.move.factory;
30+
exports ai.timefold.solver.core.config.heuristic.selector.move.composite;
31+
exports ai.timefold.solver.core.config.heuristic.selector.move.generic;
32+
exports ai.timefold.solver.core.config.heuristic.selector.move.generic.list;
33+
exports ai.timefold.solver.core.config.heuristic.selector.value;
34+
exports ai.timefold.solver.core.config.heuristic.selector.common;
35+
exports ai.timefold.solver.core.config.heuristic.selector.common.decorator;
36+
exports ai.timefold.solver.core.config.heuristic.selector.common.nearby;
37+
exports ai.timefold.solver.core.config.localsearch;
38+
exports ai.timefold.solver.core.config.localsearch.decider.forager;
39+
exports ai.timefold.solver.core.config.localsearch.decider.acceptor;
40+
exports ai.timefold.solver.core.config.localsearch.decider.acceptor.stepcountinghillclimbing;
41+
exports ai.timefold.solver.core.config.partitionedsearch;
42+
exports ai.timefold.solver.core.config.phase;
43+
exports ai.timefold.solver.core.config.phase.custom;
44+
exports ai.timefold.solver.core.config.score.director;
45+
exports ai.timefold.solver.core.config.score.trend;
46+
exports ai.timefold.solver.core.config.util;
47+
exports ai.timefold.solver.core.config;
48+
exports ai.timefold.solver.core.api.score.constraint;
49+
exports ai.timefold.solver.core.api.solver;
50+
exports ai.timefold.solver.core.api.solver.event;
51+
exports ai.timefold.solver.core.api.solver.phase;
52+
exports ai.timefold.solver.core.api.solver.change;
53+
exports ai.timefold.solver.core.config.constructionheuristic;
54+
exports ai.timefold.solver.core.enterprise;
55+
56+
// Preview APIs
57+
exports ai.timefold.solver.core.preview.api.move;
58+
exports ai.timefold.solver.core.preview.api.move.builtin;
59+
exports ai.timefold.solver.core.preview.api.domain.metamodel;
60+
exports ai.timefold.solver.core.preview.api.domain.solution.diff;
61+
exports ai.timefold.solver.core.api.score.stream.test;
62+
263
// explicit exports to other modules
364
exports ai.timefold.solver.core.impl.solver.scope to
465
ai.timefold.solver.jackson, ai.timefold.solver.benchmark, ai.timefold.solver.spring.boot.autoconfigure,
@@ -84,14 +145,7 @@
84145
exports ai.timefold.solver.core.impl.solver.monitoring to ai.timefold.solver.benchmark,
85146
ai.timefold.solver.enterprise.core;
86147

87-
// Preview APIs
88-
exports ai.timefold.solver.core.preview.api.move;
89-
exports ai.timefold.solver.core.preview.api.move.builtin;
90-
exports ai.timefold.solver.core.preview.api.domain.metamodel;
91-
exports ai.timefold.solver.core.preview.api.domain.solution.diff;
92-
exports ai.timefold.solver.core.api.score.stream.test;
93-
94-
// enterprise specific exports
148+
// enterprise-specific exports
95149
exports ai.timefold.solver.core.impl.bavet.common to ai.timefold.solver.enterprise.core;
96150
exports ai.timefold.solver.core.impl.constructionheuristic.decider to ai.timefold.solver.enterprise.core;
97151
exports ai.timefold.solver.core.impl.constructionheuristic.decider.forager to ai.timefold.solver.enterprise.core;
@@ -135,58 +189,42 @@
135189
exports ai.timefold.solver.core.impl.domain.variable.declarative;
136190
exports ai.timefold.solver.core.impl.score.stream.test;
137191

138-
// expected exports
139-
exports ai.timefold.solver.core.api.domain.common;
140-
exports ai.timefold.solver.core.api.domain.entity;
141-
exports ai.timefold.solver.core.api.domain.solution;
142-
exports ai.timefold.solver.core.api.domain.solution.cloner;
143-
exports ai.timefold.solver.core.api.domain.valuerange;
144-
exports ai.timefold.solver.core.api.domain.variable;
145-
exports ai.timefold.solver.core.api.function;
146-
exports ai.timefold.solver.core.api.score;
147-
exports ai.timefold.solver.core.api.score.analysis;
148-
exports ai.timefold.solver.core.api.score.stream;
149-
exports ai.timefold.solver.core.api.score.stream.common;
150-
exports ai.timefold.solver.core.api.score.stream.uni;
151-
exports ai.timefold.solver.core.api.score.stream.bi;
152-
exports ai.timefold.solver.core.api.score.stream.tri;
153-
exports ai.timefold.solver.core.api.score.stream.penta;
154-
exports ai.timefold.solver.core.api.score.stream.quad;
155-
exports ai.timefold.solver.core.api.score.calculator;
156-
exports ai.timefold.solver.core.config.solver;
157-
exports ai.timefold.solver.core.config.solver.random;
158-
exports ai.timefold.solver.core.config.solver.monitoring;
159-
exports ai.timefold.solver.core.config.solver.termination;
160-
exports ai.timefold.solver.core.config.heuristic.selector.entity;
161-
exports ai.timefold.solver.core.config.heuristic.selector.entity.pillar;
162-
exports ai.timefold.solver.core.config.heuristic.selector.list;
163-
exports ai.timefold.solver.core.config.heuristic.selector.move;
164-
exports ai.timefold.solver.core.config.heuristic.selector.move.factory;
165-
exports ai.timefold.solver.core.config.heuristic.selector.move.composite;
166-
exports ai.timefold.solver.core.config.heuristic.selector.move.generic;
167-
exports ai.timefold.solver.core.config.heuristic.selector.move.generic.list;
168-
exports ai.timefold.solver.core.config.heuristic.selector.value;
169-
exports ai.timefold.solver.core.config.heuristic.selector.common;
170-
exports ai.timefold.solver.core.config.heuristic.selector.common.decorator;
171-
exports ai.timefold.solver.core.config.heuristic.selector.common.nearby;
172-
exports ai.timefold.solver.core.config.localsearch;
173-
exports ai.timefold.solver.core.config.localsearch.decider.forager;
174-
exports ai.timefold.solver.core.config.localsearch.decider.acceptor;
175-
exports ai.timefold.solver.core.config.localsearch.decider.acceptor.stepcountinghillclimbing;
176-
exports ai.timefold.solver.core.config.partitionedsearch;
177-
exports ai.timefold.solver.core.config.phase;
178-
exports ai.timefold.solver.core.config.phase.custom;
179-
exports ai.timefold.solver.core.config.score.director;
180-
exports ai.timefold.solver.core.config.score.trend;
181-
exports ai.timefold.solver.core.config.util;
182-
exports ai.timefold.solver.core.config;
183-
exports ai.timefold.solver.core.api.score.constraint;
184-
exports ai.timefold.solver.core.api.solver;
185-
exports ai.timefold.solver.core.api.solver.event;
186-
exports ai.timefold.solver.core.api.solver.phase;
187-
exports ai.timefold.solver.core.api.solver.change;
188-
exports ai.timefold.solver.core.config.constructionheuristic;
189-
exports ai.timefold.solver.core.enterprise;
192+
// open configs to JAXB
193+
opens ai.timefold.solver.core.impl.io.jaxb to jakarta.xml.bind, org.glassfish.jaxb.runtime;
194+
opens ai.timefold.solver.core.config.constructionheuristic to jakarta.xml.bind, org.glassfish.jaxb.runtime;
195+
opens ai.timefold.solver.core.config.constructionheuristic.decider.forager to jakarta.xml.bind, org.glassfish.jaxb.runtime;
196+
opens ai.timefold.solver.core.config.constructionheuristic.placer to jakarta.xml.bind, org.glassfish.jaxb.runtime;
197+
opens ai.timefold.solver.core.config.exhaustivesearch to jakarta.xml.bind, org.glassfish.jaxb.runtime;
198+
opens ai.timefold.solver.core.config.heuristic.selector.entity to jakarta.xml.bind, org.glassfish.jaxb.runtime;
199+
opens ai.timefold.solver.core.config.heuristic.selector.entity.pillar to jakarta.xml.bind, org.glassfish.jaxb.runtime;
200+
opens ai.timefold.solver.core.config.heuristic.selector.list to jakarta.xml.bind, org.glassfish.jaxb.runtime;
201+
opens ai.timefold.solver.core.config.heuristic.selector.move to jakarta.xml.bind, org.glassfish.jaxb.runtime;
202+
opens ai.timefold.solver.core.config.heuristic.selector.move.factory to jakarta.xml.bind, org.glassfish.jaxb.runtime;
203+
opens ai.timefold.solver.core.config.heuristic.selector.move.composite to jakarta.xml.bind, org.glassfish.jaxb.runtime;
204+
opens ai.timefold.solver.core.config.heuristic.selector.move.generic to jakarta.xml.bind, org.glassfish.jaxb.runtime;
205+
opens ai.timefold.solver.core.config.heuristic.selector.move.generic.list to jakarta.xml.bind, org.glassfish.jaxb.runtime;
206+
opens ai.timefold.solver.core.config.heuristic.selector.move.generic.list.kopt
207+
to jakarta.xml.bind, org.glassfish.jaxb.runtime;
208+
opens ai.timefold.solver.core.config.heuristic.selector.value to jakarta.xml.bind, org.glassfish.jaxb.runtime;
209+
opens ai.timefold.solver.core.config.heuristic.selector.common to jakarta.xml.bind, org.glassfish.jaxb.runtime;
210+
opens ai.timefold.solver.core.config.heuristic.selector.common.decorator to jakarta.xml.bind, org.glassfish.jaxb.runtime;
211+
opens ai.timefold.solver.core.config.heuristic.selector.common.nearby to jakarta.xml.bind, org.glassfish.jaxb.runtime;
212+
opens ai.timefold.solver.core.config.localsearch to jakarta.xml.bind, org.glassfish.jaxb.runtime;
213+
opens ai.timefold.solver.core.config.localsearch.decider.forager to jakarta.xml.bind, org.glassfish.jaxb.runtime;
214+
opens ai.timefold.solver.core.config.localsearch.decider.acceptor to jakarta.xml.bind, org.glassfish.jaxb.runtime;
215+
opens ai.timefold.solver.core.config.localsearch.decider.acceptor.stepcountinghillclimbing
216+
to jakarta.xml.bind, org.glassfish.jaxb.runtime;
217+
opens ai.timefold.solver.core.config.partitionedsearch to jakarta.xml.bind, org.glassfish.jaxb.runtime;
218+
opens ai.timefold.solver.core.config.phase to jakarta.xml.bind, org.glassfish.jaxb.runtime;
219+
opens ai.timefold.solver.core.config.phase.custom to jakarta.xml.bind, org.glassfish.jaxb.runtime;
220+
opens ai.timefold.solver.core.config.score.director to jakarta.xml.bind, org.glassfish.jaxb.runtime;
221+
opens ai.timefold.solver.core.config.score.trend to jakarta.xml.bind, org.glassfish.jaxb.runtime;
222+
opens ai.timefold.solver.core.config.solver to jakarta.xml.bind, org.glassfish.jaxb.runtime;
223+
opens ai.timefold.solver.core.config.solver.random to jakarta.xml.bind, org.glassfish.jaxb.runtime;
224+
opens ai.timefold.solver.core.config.solver.monitoring to jakarta.xml.bind, org.glassfish.jaxb.runtime;
225+
opens ai.timefold.solver.core.config.solver.termination to jakarta.xml.bind, org.glassfish.jaxb.runtime;
226+
opens ai.timefold.solver.core.config.util to jakarta.xml.bind, org.glassfish.jaxb.runtime;
227+
opens ai.timefold.solver.core.config to jakarta.xml.bind, org.glassfish.jaxb.runtime;
190228

191229
requires commons.math3;
192230
requires jakarta.xml.bind;

persistence/jackson/pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@
2121
</description>
2222
<url>https://solver.timefold.ai</url>
2323

24-
<properties>
25-
<java.module.name>ai.timefold.solver.jackson</java.module.name>
26-
</properties>
27-
2824
<dependencies>
2925
<!-- Internal dependencies -->
3026
<dependency>

persistence/jaxb/pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@
2121
</description>
2222
<url>https://solver.timefold.ai</url>
2323

24-
<properties>
25-
<java.module.name>ai.timefold.solver.jaxb</java.module.name>
26-
</properties>
27-
2824
<dependencies>
2925
<!-- Internal dependencies -->
3026
<dependency>

persistence/jpa/pom.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,6 @@
2121
</description>
2222
<url>https://solver.timefold.ai</url>
2323

24-
<properties>
25-
<java.module.name>ai.timefold.solver.jpa</java.module.name>
26-
<enforcer.failOnDuplicatedClasses>false</enforcer.failOnDuplicatedClasses> <!-- Quarkus. -->
27-
</properties>
28-
2924
<dependencies>
3025
<!-- Internal dependencies -->
3126
<dependency>

quarkus-integration/quarkus-benchmark/deployment/pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
<description>Quarkus deployment module for timefold-solver-quarkus-benchmark.</description>
1414
<url>https://solver.timefold.ai</url>
1515

16-
<properties>
17-
<java.module.name>ai.timefold.solver.quarkus.benchmark.deployment</java.module.name>
18-
</properties>
19-
2016
<dependencies>
2117
<dependency>
2218
<groupId>io.quarkus</groupId>

0 commit comments

Comments
 (0)