├── .gitignore
├── 1_Classpath
├── .gitignore
├── lib
│ ├── antlr-2.7.7.jar
│ ├── cdi-api-1.1.jar
│ ├── classmate-1.3.0.jar
│ ├── commons-dbcp-1.4.jar
│ ├── commons-logging-1.2.jar
│ ├── commons-pool-1.5.4.jar
│ ├── dom4j-1.6.1.jar
│ ├── el-api-2.2.jar
│ ├── geronimo-jta_1.1_spec-1.1.1.jar
│ ├── hibernate-commons-annotations-5.0.1.Final.jar
│ ├── hibernate-core-5.2.2.Final.jar
│ ├── hibernate-jpa-2.1-api-1.0.0.Final.jar
│ ├── hsqldb-2.3.4.jar
│ ├── jandex-2.0.0.Final.jar
│ ├── javassist-3.20.0-GA.jar
│ ├── javax.inject-1.jar
│ ├── jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
│ ├── jboss-logging-3.3.0.Final.jar
│ ├── jcl-over-slf4j-1.7.21.jar
│ ├── jsr250-api-1.0.jar
│ ├── log4j-api-2.6.2.jar
│ ├── log4j-core-2.6.2.jar
│ ├── slf4j-api-1.7.21.jar
│ ├── slf4j-simple-1.7.21.jar
│ ├── spring-aop-4.3.2.RELEASE.jar
│ ├── spring-beans-4.3.2.RELEASE.jar
│ ├── spring-context-4.3.2.RELEASE.jar
│ ├── spring-core-4.3.2.RELEASE.jar
│ ├── spring-expression-4.3.2.RELEASE.jar
│ ├── spring-jdbc-4.3.2.RELEASE.jar
│ ├── spring-orm-4.3.2.RELEASE.jar
│ └── spring-tx-4.3.2.RELEASE.jar
├── run.sh
└── src
│ ├── books
│ ├── api
│ │ ├── entities
│ │ │ └── Book.java
│ │ └── service
│ │ │ └── BooksService.java
│ └── impl
│ │ ├── entities
│ │ └── BookEntity.java
│ │ └── service
│ │ └── HibernateBooksService.java
│ ├── bookstore
│ ├── api
│ │ └── service
│ │ │ └── BookstoreService.java
│ └── impl
│ │ └── service
│ │ └── BookstoreServiceImpl.java
│ ├── log4j2.xml
│ ├── main.xml
│ └── main
│ └── Main.java
├── 2_Modules
├── .gitignore
├── run.sh
└── src
│ ├── books.api
│ ├── books
│ │ └── api
│ │ │ ├── entities
│ │ │ └── Book.java
│ │ │ └── service
│ │ │ └── BooksService.java
│ └── module-info.java
│ ├── books.impl
│ ├── books
│ │ └── impl
│ │ │ ├── entities
│ │ │ └── BookEntity.java
│ │ │ └── service
│ │ │ └── InMemoryBooksService.java
│ └── module-info.java
│ ├── bookstore
│ ├── bookstore
│ │ ├── api
│ │ │ └── service
│ │ │ │ └── BookstoreService.java
│ │ └── impl
│ │ │ └── service
│ │ │ └── BookstoreServiceImpl.java
│ └── module-info.java
│ └── main
│ ├── bookapp
│ └── BookApp.java
│ └── module-info.java
├── 3_MonolithicSpring
├── .gitignore
├── lib
│ ├── antlr-2.7.7.jar
│ ├── cdi-api-1.1.jar
│ ├── classmate-1.3.0.jar
│ ├── commons-dbcp-1.4.jar
│ ├── commons-logging-1.2.jar
│ ├── commons-pool-1.5.4.jar
│ ├── dom4j-1.6.1.jar
│ ├── el-api-2.2.jar
│ ├── geronimo-jta_1.1_spec-1.1.1.jar
│ ├── hibernate-commons-annotations-5.0.1.Final.jar
│ ├── hsqldb-2.3.4.jar
│ ├── jandex-2.0.0.Final.jar
│ ├── jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
│ ├── jboss-logging-3.3.0.Final.jar
│ ├── jcl-over-slf4j-1.7.21.jar
│ ├── jsr250-api-1.0.jar
│ ├── log4j-api-2.6.2.jar
│ ├── log4j-core-2.6.2.jar
│ ├── slf4j-api-1.7.21.jar
│ ├── slf4j-simple-1.7.21.jar
│ ├── spring-aop-4.3.2.RELEASE.jar
│ ├── spring-beans-4.3.2.RELEASE.jar
│ ├── spring-core-4.3.2.RELEASE.jar
│ ├── spring-expression-4.3.2.RELEASE.jar
│ ├── spring-jdbc-4.3.2.RELEASE.jar
│ └── spring-orm-4.3.2.RELEASE.jar
├── mods
│ ├── hibernate-core-5.2.2.Final.jar
│ ├── hibernate-jpa-2.1-api-1.0.0.Final.jar
│ ├── javassist-3.20.0-GA.jar
│ ├── javax.inject-1.jar
│ ├── spring-context-4.3.2.RELEASE.jar
│ └── spring-tx-4.3.2.RELEASE.jar
├── run.sh
└── src
│ └── bookapp
│ ├── books
│ ├── api
│ │ ├── entities
│ │ │ └── Book.java
│ │ └── service
│ │ │ └── BooksService.java
│ └── impl
│ │ ├── entities
│ │ └── BookEntity.java
│ │ └── service
│ │ └── HibernateBooksService.java
│ ├── bookstore
│ ├── api
│ │ └── service
│ │ │ └── BookstoreService.java
│ └── impl
│ │ └── service
│ │ └── BookstoreServiceImpl.java
│ ├── log4j2.xml
│ ├── main.xml
│ ├── main
│ └── Main.java
│ └── module-info.java
├── 4_ModularSpring
├── .gitignore
├── README.md
├── createcp.groovy
├── lib
│ ├── antlr-2.7.7.jar
│ ├── cdi-api-1.1.jar
│ ├── classmate-1.3.0.jar
│ ├── commons-dbcp-1.4.jar
│ ├── commons-logging-1.2.jar
│ ├── commons-pool-1.5.4.jar
│ ├── dom4j-1.6.1.jar
│ ├── el-api-2.2.jar
│ ├── geronimo-jta_1.1_spec-1.1.1.jar
│ ├── hibernate-commons-annotations-5.0.1.Final.jar
│ ├── hsqldb-2.3.4.jar
│ ├── jandex-2.0.0.Final.jar
│ ├── jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
│ ├── jboss-logging-3.3.0.Final.jar
│ ├── jcl-over-slf4j-1.7.21.jar
│ ├── jsr250-api-1.0.jar
│ ├── log4j-api-2.6.2.jar
│ ├── log4j-core-2.6.2.jar
│ ├── slf4j-api-1.7.21.jar
│ ├── slf4j-simple-1.7.21.jar
│ ├── spring-aop-4.3.2.RELEASE.jar
│ ├── spring-beans-4.3.2.RELEASE.jar
│ ├── spring-core-4.3.2.RELEASE.jar
│ ├── spring-expression-4.3.2.RELEASE.jar
│ ├── spring-jdbc-4.3.2.RELEASE.jar
│ └── spring-orm-4.3.2.RELEASE.jar
├── mods
│ ├── hibernate-core-5.2.2.Final.jar
│ ├── hibernate-jpa-2.1-api-1.0.0.Final.jar
│ ├── javassist-3.20.0-GA.jar
│ ├── javax.inject-1.jar
│ ├── spring-context-4.3.2.RELEASE.jar
│ └── spring-tx-4.3.2.RELEASE.jar
├── run.sh
└── src
│ ├── books.api
│ ├── books
│ │ └── api
│ │ │ ├── entities
│ │ │ └── Book.java
│ │ │ └── service
│ │ │ └── BooksService.java
│ └── module-info.java
│ ├── books.impl
│ ├── books-spring.xml
│ ├── books
│ │ └── impl
│ │ │ ├── entities
│ │ │ └── BookEntity.java
│ │ │ └── service
│ │ │ └── HibernateBooksService.java
│ └── module-info.java
│ ├── bookstore
│ ├── bookstore-spring.xml
│ ├── bookstore
│ │ ├── api
│ │ │ └── service
│ │ │ │ └── BookstoreService.java
│ │ └── impl
│ │ │ └── service
│ │ │ └── BookstoreServiceImpl.java
│ └── module-info.java
│ └── main
│ ├── log4j2.xml
│ ├── main
│ └── Main.java
│ └── module-info.java
├── 5_MavenAndServices
├── books
│ ├── books.iml
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ ├── books
│ │ │ ├── api
│ │ │ │ ├── entities
│ │ │ │ │ └── Book.java
│ │ │ │ └── service
│ │ │ │ │ └── BooksService.java
│ │ │ └── impl
│ │ │ │ ├── entities
│ │ │ │ └── BookEntity.java
│ │ │ │ └── service
│ │ │ │ └── HibernateBooksService.java
│ │ └── module-info.java
│ │ └── resources
│ │ └── META-INF
│ │ └── persistence.xml
├── bookstore
│ ├── bookstore.iml
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── bookstore
│ │ └── service
│ │ │ ├── api
│ │ │ └── BookstoreService.java
│ │ │ └── impl
│ │ │ └── BookstoreServiceImpl.java
│ │ └── module-info.java
├── main
│ ├── main.iml
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── main
│ │ └── Main.java
│ │ └── module-info.java
├── pom.xml
└── spring-hibernate-example.iml
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | 1_Classpath/out
2 | bookapp@1.0.jar
3 | 3_MonolithicSpring/out
4 | 4_ModularSpring/mods/books.api@1.0.jar
5 | 4_ModularSpring/mods/books.impl@1.0.jar
6 | 4_ModularSpring/mods/bookstore@1.0.jar
7 | 4_ModularSpring/mods/main@1.0.jar
8 | 4_ModularSpring/out
9 |
--------------------------------------------------------------------------------
/1_Classpath/.gitignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/.gitignore
--------------------------------------------------------------------------------
/1_Classpath/lib/antlr-2.7.7.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/antlr-2.7.7.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/cdi-api-1.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/cdi-api-1.1.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/classmate-1.3.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/classmate-1.3.0.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/commons-dbcp-1.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/commons-dbcp-1.4.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/commons-logging-1.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/commons-logging-1.2.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/commons-pool-1.5.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/commons-pool-1.5.4.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/dom4j-1.6.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/dom4j-1.6.1.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/el-api-2.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/el-api-2.2.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/geronimo-jta_1.1_spec-1.1.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/geronimo-jta_1.1_spec-1.1.1.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/hibernate-commons-annotations-5.0.1.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/hibernate-commons-annotations-5.0.1.Final.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/hibernate-core-5.2.2.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/hibernate-core-5.2.2.Final.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/hsqldb-2.3.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/hsqldb-2.3.4.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/jandex-2.0.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/jandex-2.0.0.Final.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/javassist-3.20.0-GA.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/javassist-3.20.0-GA.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/javax.inject-1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/javax.inject-1.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/jboss-logging-3.3.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/jboss-logging-3.3.0.Final.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/jcl-over-slf4j-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/jcl-over-slf4j-1.7.21.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/jsr250-api-1.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/jsr250-api-1.0.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/log4j-api-2.6.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/log4j-api-2.6.2.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/log4j-core-2.6.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/log4j-core-2.6.2.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/slf4j-api-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/slf4j-api-1.7.21.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/slf4j-simple-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/slf4j-simple-1.7.21.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/spring-aop-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/spring-aop-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/spring-beans-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/spring-beans-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/spring-context-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/spring-context-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/spring-core-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/spring-core-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/spring-expression-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/spring-expression-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/spring-jdbc-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/spring-jdbc-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/spring-orm-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/spring-orm-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/1_Classpath/lib/spring-tx-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/1_Classpath/lib/spring-tx-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/1_Classpath/run.sh:
--------------------------------------------------------------------------------
1 | set -e
2 | CLASSPATH=lib/antlr-2.7.7.jar:lib/cdi-api-1.1.jar:lib/classmate-1.3.0.jar:lib/commons-dbcp-1.4.jar:lib/commons-logging-1.2.jar:lib/commons-pool-1.5.4.jar:lib/dom4j-1.6.1.jar:lib/el-api-2.2.jar:lib/geronimo-jta_1.1_spec-1.1.1.jar:lib/hibernate-commons-annotations-5.0.1.Final.jar:lib/hibernate-core-5.2.2.Final.jar:lib/hibernate-jpa-2.1-api-1.0.0.Final.jar:lib/hsqldb-2.3.4.jar:lib/jandex-2.0.0.Final.jar:lib/javassist-3.20.0-GA.jar:lib/javax.inject-1.jar:lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar:lib/jboss-logging-3.3.0.Final.jar:lib/jcl-over-slf4j-1.7.21.jar:lib/jsr250-api-1.0.jar:lib/log4j-api-2.6.2.jar:lib/log4j-core-2.6.2.jar:lib/slf4j-api-1.7.21.jar:lib/slf4j-simple-1.7.21.jar:lib/spring-aop-4.3.2.RELEASE.jar:lib/spring-beans-4.3.2.RELEASE.jar:lib/spring-context-4.3.2.RELEASE.jar:lib/spring-core-4.3.2.RELEASE.jar:lib/spring-expression-4.3.2.RELEASE.jar:lib/spring-jdbc-4.3.2.RELEASE.jar:lib/spring-orm-4.3.2.RELEASE.jar:lib/spring-tx-4.3.2.RELEASE.jar
3 |
4 | javac -cp $CLASSPATH -d out -sourcepath src $(find src -name '*.java')
5 |
6 | cp $(find src -name '*.xml') out
7 |
8 | java -cp $CLASSPATH:out --add-modules java.xml.bind main.Main
9 |
--------------------------------------------------------------------------------
/1_Classpath/src/books/api/entities/Book.java:
--------------------------------------------------------------------------------
1 | package books.api.entities;
2 |
3 | public interface Book {
4 | int getId();
5 | String getTitle();
6 | double getPrice();
7 | }
8 |
--------------------------------------------------------------------------------
/1_Classpath/src/books/api/service/BooksService.java:
--------------------------------------------------------------------------------
1 | package books.api.service;
2 |
3 | import books.api.entities.Book;
4 |
5 | public interface BooksService {
6 | Book getBook(int id);
7 | int createBook(String title, double price);
8 | }
9 |
--------------------------------------------------------------------------------
/1_Classpath/src/books/impl/entities/BookEntity.java:
--------------------------------------------------------------------------------
1 | package books.impl.entities;
2 |
3 | import books.api.entities.Book;
4 | import javax.persistence.*;
5 |
6 | @Entity
7 | public class BookEntity implements Book {
8 | @Id @GeneratedValue
9 | private int id;
10 | private String title;
11 | private double price;
12 |
13 | public BookEntity() {}
14 |
15 | public BookEntity(String title, double price) {
16 | this.title = title;
17 | this.price = price;
18 | }
19 |
20 | public int getId() {
21 | return id;
22 | }
23 |
24 | public String getTitle() {
25 | return title;
26 | }
27 |
28 | public double getPrice() {
29 | return price;
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/1_Classpath/src/books/impl/service/HibernateBooksService.java:
--------------------------------------------------------------------------------
1 | package books.impl.service;
2 |
3 | import books.api.entities.Book;
4 | import books.api.service.BooksService;
5 | import books.impl.entities.BookEntity;
6 | import org.springframework.transaction.annotation.Transactional;
7 | import org.springframework.stereotype.Repository;
8 | import org.hibernate.SessionFactory;
9 | import javax.inject.Inject;
10 |
11 | @Repository
12 | @Transactional
13 | public class HibernateBooksService implements BooksService {
14 |
15 | @Inject
16 | private SessionFactory sessionFactory;
17 |
18 | public Book getBook(int id) {
19 | return sessionFactory.getCurrentSession().get(BookEntity.class, id);
20 | }
21 |
22 | public int createBook(String title, double price) {
23 |
24 | BookEntity entity = new BookEntity(title, price);
25 | sessionFactory.getCurrentSession().saveOrUpdate(entity);
26 |
27 | return entity.getId();
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/1_Classpath/src/bookstore/api/service/BookstoreService.java:
--------------------------------------------------------------------------------
1 | package bookstore.api.service;
2 |
3 | import books.api.service.BooksService;
4 |
5 | public interface BookstoreService {
6 | double calculatePrice(int... bookIds);
7 | }
8 |
--------------------------------------------------------------------------------
/1_Classpath/src/bookstore/impl/service/BookstoreServiceImpl.java:
--------------------------------------------------------------------------------
1 | package bookstore.impl.service;
2 |
3 | import java.util.Arrays;
4 | import books.api.entities.Book;
5 | import books.api.service.BooksService;
6 | import bookstore.api.service.BookstoreService;
7 | import org.springframework.stereotype.Component;
8 |
9 | @Component
10 | public class BookstoreServiceImpl implements BookstoreService {
11 |
12 | private static double TAX = 1.21d;
13 |
14 | private BooksService booksService;
15 |
16 | public BookstoreServiceImpl(BooksService booksService) {
17 | this.booksService = booksService;
18 | }
19 |
20 | public double calculatePrice(int... bookIds) {
21 | double total = Arrays
22 | .stream(bookIds)
23 | .mapToDouble(id -> booksService.getBook(id).getPrice())
24 | .sum();
25 |
26 | return total * TAX;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/1_Classpath/src/log4j2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/1_Classpath/src/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | books.impl.entities.BookEntity
31 |
32 |
33 |
34 |
35 |
36 | create
37 |
38 |
39 |
40 |
41 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/1_Classpath/src/main/Main.java:
--------------------------------------------------------------------------------
1 | package main;
2 |
3 | import org.springframework.context.ApplicationContext;
4 | import org.springframework.context.support.ClassPathXmlApplicationContext;
5 | import books.api.service.BooksService;
6 | import books.api.entities.Book;
7 | import bookstore.api.service.BookstoreService;
8 |
9 | public class Main {
10 |
11 | public void start() {
12 | System.out.println("Starting...");
13 |
14 | ApplicationContext context =
15 | new ClassPathXmlApplicationContext(new String[] {"classpath:/main.xml"});
16 |
17 |
18 | BooksService booksService = context.getBean(BooksService.class);
19 | BookstoreService store = context.getBean(BookstoreService.class);
20 |
21 | // Create some books
22 | int id1 = booksService.createBook("Java 9 Modularity", 45.0d);
23 | int id2 = booksService.createBook("Modular Cloud Apps with OSGi", 40.0d);
24 | printf("Created books with id [%d, %d]", id1, id2);
25 |
26 | // Retrieve them again
27 | Book book1 = booksService.getBook(id1);
28 | Book book2 = booksService.getBook(id2);
29 | printf("Retrieved books:\n %d: %s [%.2f]\n %d: %s [%.2f]",
30 | id1, book1.getTitle(), book1.getPrice(), id2, book2.getTitle(), book2.getPrice());
31 |
32 | // Use the other service to calculate a total
33 | double total = store.calculatePrice(id1, id2);
34 | printf("Total price (with tax): %.2f", total);
35 |
36 | }
37 |
38 | public static void main(String[] args) {
39 | new Main().start();
40 | }
41 |
42 | private void printf(String msg, Object... args) {
43 | System.out.println(String.format(msg + "\n", args));
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/2_Modules/.gitignore:
--------------------------------------------------------------------------------
1 | out/
2 |
--------------------------------------------------------------------------------
/2_Modules/run.sh:
--------------------------------------------------------------------------------
1 | javac --module-source-path src -d out $(find . -name '*.java')
2 | java --module-path out -m main/bookapp.BookApp;
3 |
--------------------------------------------------------------------------------
/2_Modules/src/books.api/books/api/entities/Book.java:
--------------------------------------------------------------------------------
1 | package books.api.entities;
2 |
3 | public interface Book {
4 | int getId();
5 | String getTitle();
6 | double getPrice();
7 | }
8 |
--------------------------------------------------------------------------------
/2_Modules/src/books.api/books/api/service/BooksService.java:
--------------------------------------------------------------------------------
1 | package books.api.service;
2 |
3 | import books.api.entities.Book;
4 |
5 | public interface BooksService {
6 | Book getBook(int id);
7 | int createBook(String title, double price);
8 | }
9 |
--------------------------------------------------------------------------------
/2_Modules/src/books.api/module-info.java:
--------------------------------------------------------------------------------
1 | module books.api {
2 | exports books.api.entities;
3 | exports books.api.service;
4 | }
5 |
--------------------------------------------------------------------------------
/2_Modules/src/books.impl/books/impl/entities/BookEntity.java:
--------------------------------------------------------------------------------
1 | package books.impl.entities;
2 |
3 | import books.api.entities.Book;
4 |
5 | public class BookEntity implements Book {
6 | private int id;
7 | private String title;
8 | private double price;
9 |
10 | public BookEntity(int id, String title, double price) {
11 | this.id = id;
12 | this.title = title;
13 | this.price = price;
14 | }
15 |
16 | public int getId() {
17 | return id;
18 | }
19 |
20 | public String getTitle() {
21 | return title;
22 | }
23 |
24 | public double getPrice() {
25 | return price;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/2_Modules/src/books.impl/books/impl/service/InMemoryBooksService.java:
--------------------------------------------------------------------------------
1 | package books.impl.service;
2 |
3 | import books.api.entities.Book;
4 | import books.api.service.BooksService;
5 | import books.impl.entities.BookEntity;
6 | import java.util.concurrent.atomic.AtomicInteger;
7 | import java.util.concurrent.ConcurrentHashMap;
8 |
9 | public class InMemoryBooksService implements BooksService {
10 | private final static BooksService instance = new InMemoryBooksService();
11 |
12 | private AtomicInteger nextId = new AtomicInteger();
13 | private ConcurrentHashMap books = new ConcurrentHashMap<>();
14 |
15 | public Book getBook(int id) {
16 | return books.get(id);
17 | }
18 |
19 | public int createBook(String title, double price) {
20 | int id = nextId.incrementAndGet();
21 | books.put(id, new BookEntity(id, title, price));
22 | return id;
23 | }
24 |
25 | public static BooksService provider() {
26 | return instance;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/2_Modules/src/books.impl/module-info.java:
--------------------------------------------------------------------------------
1 | module books.impl {
2 | requires books.api;
3 |
4 | provides books.api.service.BooksService with books.impl.service.InMemoryBooksService;
5 | }
6 |
--------------------------------------------------------------------------------
/2_Modules/src/bookstore/bookstore/api/service/BookstoreService.java:
--------------------------------------------------------------------------------
1 | package bookstore.api.service;
2 |
3 | import books.api.service.BooksService;
4 |
5 | public interface BookstoreService {
6 | double calculatePrice(int... bookIds);
7 | }
8 |
--------------------------------------------------------------------------------
/2_Modules/src/bookstore/bookstore/impl/service/BookstoreServiceImpl.java:
--------------------------------------------------------------------------------
1 | package bookstore.impl.service;
2 |
3 | import java.util.Arrays;
4 | import books.api.entities.Book;
5 | import books.api.service.BooksService;
6 | import bookstore.api.service.BookstoreService;
7 | import java.util.ServiceLoader;
8 | import java.util.Iterator;
9 | import java.util.Optional;
10 |
11 | public class BookstoreServiceImpl implements BookstoreService {
12 |
13 | private static double TAX = 1.21d;
14 |
15 | public double calculatePrice(int... bookIds) {
16 | Optional service = ServiceLoader.load(BooksService.class).findFirst();
17 |
18 | if(service.isPresent()) {
19 | double total = Arrays
20 | .stream(bookIds)
21 | .mapToDouble(id -> service.get().getBook(id).getPrice())
22 | .sum();
23 |
24 | return total * TAX;
25 | }
26 |
27 | return 0;
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/2_Modules/src/bookstore/module-info.java:
--------------------------------------------------------------------------------
1 | module bookstore {
2 | requires transitive books.api;
3 |
4 | exports bookstore.api.service;
5 |
6 | provides bookstore.api.service.BookstoreService with bookstore.impl.service.BookstoreServiceImpl;
7 | uses books.api.service.BooksService;
8 | }
9 |
--------------------------------------------------------------------------------
/2_Modules/src/main/bookapp/BookApp.java:
--------------------------------------------------------------------------------
1 | package bookapp;
2 |
3 | import books.api.entities.Book;
4 | import books.api.service.BooksService;
5 | import bookstore.api.service.BookstoreService;
6 | import java.util.ServiceLoader;
7 |
8 | public class BookApp {
9 | public static void main(String... args) {
10 | // Instantiation and 'wiring'
11 | BooksService booksService = ServiceLoader.load(BooksService.class).findFirst().get();
12 | BookstoreService store = ServiceLoader.load(BookstoreService.class).findFirst().get();
13 |
14 | // Create some books
15 | int id1 = booksService.createBook("Java 9 Modularity", 45.0d);
16 | int id2 = booksService.createBook("Modular Cloud Apps with OSGi", 40.0d);
17 | printf("Created books with id [%d, %d]", id1, id2);
18 |
19 | // Retrieve them again
20 | Book book1 = booksService.getBook(id1);
21 | Book book2 = booksService.getBook(id2);
22 | printf("Retrieved books:\n %d: %s [%.2f]\n %d: %s [%.2f]",
23 | id1, book1.getTitle(), book1.getPrice(), id2, book2.getTitle(), book2.getPrice());
24 |
25 | // Use the other service to calculate a total
26 | double total = store.calculatePrice(id1, id2);
27 | printf("Total price (with tax): %.2f", total);
28 | }
29 |
30 | private static void printf(String msg, Object... args) {
31 | System.out.println(String.format(msg + "\n", args));
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/2_Modules/src/main/module-info.java:
--------------------------------------------------------------------------------
1 | module main {
2 | requires books.impl;
3 | requires bookstore;
4 |
5 | uses books.api.service.BooksService;
6 | uses bookstore.api.service.BookstoreService;
7 | }
8 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/.gitignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/.gitignore
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/antlr-2.7.7.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/antlr-2.7.7.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/cdi-api-1.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/cdi-api-1.1.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/classmate-1.3.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/classmate-1.3.0.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/commons-dbcp-1.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/commons-dbcp-1.4.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/commons-logging-1.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/commons-logging-1.2.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/commons-pool-1.5.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/commons-pool-1.5.4.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/dom4j-1.6.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/dom4j-1.6.1.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/el-api-2.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/el-api-2.2.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/geronimo-jta_1.1_spec-1.1.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/geronimo-jta_1.1_spec-1.1.1.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/hibernate-commons-annotations-5.0.1.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/hibernate-commons-annotations-5.0.1.Final.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/hsqldb-2.3.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/hsqldb-2.3.4.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/jandex-2.0.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/jandex-2.0.0.Final.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/jboss-logging-3.3.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/jboss-logging-3.3.0.Final.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/jcl-over-slf4j-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/jcl-over-slf4j-1.7.21.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/jsr250-api-1.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/jsr250-api-1.0.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/log4j-api-2.6.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/log4j-api-2.6.2.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/log4j-core-2.6.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/log4j-core-2.6.2.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/slf4j-api-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/slf4j-api-1.7.21.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/slf4j-simple-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/slf4j-simple-1.7.21.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/spring-aop-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/spring-aop-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/spring-beans-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/spring-beans-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/spring-core-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/spring-core-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/spring-expression-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/spring-expression-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/spring-jdbc-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/spring-jdbc-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/lib/spring-orm-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/lib/spring-orm-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/mods/hibernate-core-5.2.2.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/mods/hibernate-core-5.2.2.Final.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/mods/hibernate-jpa-2.1-api-1.0.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/mods/hibernate-jpa-2.1-api-1.0.0.Final.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/mods/javassist-3.20.0-GA.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/mods/javassist-3.20.0-GA.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/mods/javax.inject-1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/mods/javax.inject-1.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/mods/spring-context-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/mods/spring-context-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/mods/spring-tx-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/3_MonolithicSpring/mods/spring-tx-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/3_MonolithicSpring/run.sh:
--------------------------------------------------------------------------------
1 | CLASSPATH=lib/antlr-2.7.7.jar:lib/cdi-api-1.1.jar:lib/classmate-1.3.0.jar:lib/commons-dbcp-1.4.jar:lib/commons-logging-1.2.jar:lib/commons-pool-1.5.4.jar:lib/dom4j-1.6.1.jar:lib/el-api-2.2.jar:lib/geronimo-jta_1.1_spec-1.1.1.jar:lib/hibernate-commons-annotations-5.0.1.Final.jar:lib/hsqldb-2.3.4.jar:lib/jandex-2.0.0.Final.jar:lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar:lib/jboss-logging-3.3.0.Final.jar:lib/jcl-over-slf4j-1.7.21.jar:lib/jsr250-api-1.0.jar:lib/log4j-api-2.6.2.jar:lib/log4j-core-2.6.2.jar:lib/slf4j-api-1.7.21.jar:lib/slf4j-simple-1.7.21.jar:lib/spring-aop-4.3.2.RELEASE.jar:lib/spring-beans-4.3.2.RELEASE.jar:lib/spring-core-4.3.2.RELEASE.jar:lib/spring-expression-4.3.2.RELEASE.jar:lib/spring-jdbc-4.3.2.RELEASE.jar:lib/spring-orm-4.3.2.RELEASE.jar
2 |
3 | javac -cp $CLASSPATH \
4 | --module-path mods \
5 | -d out \
6 | --add-modules java.naming \
7 | --module-source-path src \
8 | -m bookapp
9 |
10 | cp $(find src -name '*.xml') out/bookapp
11 |
12 | java -cp $CLASSPATH \
13 | --add-modules java.sql,java.xml.bind \
14 | --module-path mods:out \
15 | --add-opens java.base/java.lang=javassist \
16 | -m bookapp/main.Main
17 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/books/api/entities/Book.java:
--------------------------------------------------------------------------------
1 | package books.api.entities;
2 |
3 | public interface Book {
4 | int getId();
5 | String getTitle();
6 | double getPrice();
7 | }
8 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/books/api/service/BooksService.java:
--------------------------------------------------------------------------------
1 | package books.api.service;
2 |
3 | import books.api.entities.Book;
4 |
5 | public interface BooksService {
6 | Book getBook(int id);
7 | int createBook(String title, double price);
8 | }
9 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/books/impl/entities/BookEntity.java:
--------------------------------------------------------------------------------
1 | package books.impl.entities;
2 |
3 | import books.api.entities.Book;
4 | import javax.persistence.*;
5 |
6 | @Entity
7 | public class BookEntity implements Book {
8 | @Id @GeneratedValue
9 | private int id;
10 | private String title;
11 | private double price;
12 |
13 | public BookEntity() {}
14 |
15 | public BookEntity(String title, double price) {
16 | this.title = title;
17 | this.price = price;
18 | }
19 |
20 | public int getId() {
21 | return id;
22 | }
23 |
24 | public String getTitle() {
25 | return title;
26 | }
27 |
28 | public double getPrice() {
29 | return price;
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/books/impl/service/HibernateBooksService.java:
--------------------------------------------------------------------------------
1 | package books.impl.service;
2 |
3 | import books.api.entities.Book;
4 | import books.api.service.BooksService;
5 | import books.impl.entities.BookEntity;
6 | import org.springframework.transaction.annotation.Transactional;
7 | import org.springframework.stereotype.Repository;
8 | import org.hibernate.SessionFactory;
9 | import javax.inject.Inject;
10 |
11 | @Repository
12 | @Transactional
13 | public class HibernateBooksService implements BooksService {
14 |
15 | @Inject
16 | private SessionFactory sessionFactory;
17 |
18 | public Book getBook(int id) {
19 | return sessionFactory.getCurrentSession().get(BookEntity.class, id);
20 | }
21 |
22 | public int createBook(String title, double price) {
23 |
24 | BookEntity entity = new BookEntity(title, price);
25 | sessionFactory.getCurrentSession().saveOrUpdate(entity);
26 |
27 | return entity.getId();
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/bookstore/api/service/BookstoreService.java:
--------------------------------------------------------------------------------
1 | package bookstore.api.service;
2 |
3 | import books.api.service.BooksService;
4 |
5 | public interface BookstoreService {
6 | double calculatePrice(int... bookIds);
7 | }
8 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/bookstore/impl/service/BookstoreServiceImpl.java:
--------------------------------------------------------------------------------
1 | package bookstore.impl.service;
2 |
3 | import java.util.Arrays;
4 | import books.api.entities.Book;
5 | import books.api.service.BooksService;
6 | import bookstore.api.service.BookstoreService;
7 | import org.springframework.stereotype.Component;
8 |
9 | @Component
10 | public class BookstoreServiceImpl implements BookstoreService {
11 |
12 | private static double TAX = 1.21d;
13 |
14 | private BooksService booksService;
15 |
16 | public BookstoreServiceImpl(BooksService booksService) {
17 | this.booksService = booksService;
18 | }
19 |
20 | public double calculatePrice(int... bookIds) {
21 | double total = Arrays
22 | .stream(bookIds)
23 | .mapToDouble(id -> booksService.getBook(id).getPrice())
24 | .sum();
25 |
26 | return total * TAX;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/log4j2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | books.impl.entities.BookEntity
31 |
32 |
33 |
34 |
35 |
36 | create
37 |
38 |
39 |
40 |
41 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/main/Main.java:
--------------------------------------------------------------------------------
1 | package main;
2 |
3 | import org.springframework.context.ApplicationContext;
4 | import org.springframework.context.support.ClassPathXmlApplicationContext;
5 | import books.api.service.BooksService;
6 | import books.api.entities.Book;
7 | import bookstore.api.service.BookstoreService;
8 |
9 | public class Main {
10 |
11 | public void start() {
12 | System.out.println("Starting...");
13 |
14 | ApplicationContext context =
15 | new ClassPathXmlApplicationContext(new String[] {"classpath:/main.xml"});
16 |
17 |
18 | BooksService booksService = context.getBean(BooksService.class);
19 | BookstoreService store = context.getBean(BookstoreService.class);
20 |
21 | // Create some books
22 | int id1 = booksService.createBook("Java 9 Modularity", 45.0d);
23 | int id2 = booksService.createBook("Modular Cloud Apps with OSGi", 40.0d);
24 | printf("Created books with id [%d, %d]", id1, id2);
25 |
26 | // Retrieve them again
27 | Book book1 = booksService.getBook(id1);
28 | Book book2 = booksService.getBook(id2);
29 | printf("Retrieved books:\n %d: %s [%.2f]\n %d: %s [%.2f]",
30 | id1, book1.getTitle(), book1.getPrice(), id2, book2.getTitle(), book2.getPrice());
31 |
32 | // Use the other service to calculate a total
33 | double total = store.calculatePrice(id1, id2);
34 | printf("Total price (with tax): %.2f", total);
35 |
36 | }
37 |
38 | public static void main(String[] args) {
39 | new Main().start();
40 | }
41 |
42 | private void printf(String msg, Object... args) {
43 | System.out.println(String.format(msg + "\n", args));
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/3_MonolithicSpring/src/bookapp/module-info.java:
--------------------------------------------------------------------------------
1 | module bookapp {
2 | requires spring.context;
3 | requires spring.tx;
4 | requires javax.inject;
5 | requires hibernate.core;
6 | requires hibernate.jpa;
7 |
8 | opens books.impl.entities;
9 | opens books.impl.service;
10 | opens bookstore.impl.service;
11 |
12 | exports books.api.service;
13 | exports books.api.entities;
14 | }
--------------------------------------------------------------------------------
/4_ModularSpring/.gitignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/.gitignore
--------------------------------------------------------------------------------
/4_ModularSpring/README.md:
--------------------------------------------------------------------------------
1 |
2 | Need java.naming as a *compile time* dependency because of: `sessionFactory.getCurrentSession()`
3 |
4 |
5 | Need to add javassist to automatic modules:
6 |
7 | ```
8 | Caused by: java.lang.IllegalAccessError: superinterface check failed: class books.impl.entities.BookEntity_$$_jvst7f7_0 (in module bookapp) cannot access class javassist.util.proxy.ProxyObject (in unnamed module @0x1ecfcbc9) because module bookapp does not read unnamed module @0x1ecfcbc9
9 | ```
10 |
11 | Need to build jars to make classpath scanning work. This is probably because Spring doesnt understand the extra top level dir in exploded form.
12 |
13 | Export api packages:
14 | ```
15 | Caused by: java.lang.IllegalAccessException: class org.springframework.aop.support.AopUtils cannot access interface books.api.service.BooksService (in module bookapp) because module bookapp does not export books.api.service to unnamed module @2bac9ba
16 |
17 | ```
18 |
--------------------------------------------------------------------------------
/4_ModularSpring/createcp.groovy:
--------------------------------------------------------------------------------
1 | println new File('lib').listFiles().join(':')
--------------------------------------------------------------------------------
/4_ModularSpring/lib/antlr-2.7.7.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/antlr-2.7.7.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/cdi-api-1.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/cdi-api-1.1.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/classmate-1.3.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/classmate-1.3.0.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/commons-dbcp-1.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/commons-dbcp-1.4.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/commons-logging-1.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/commons-logging-1.2.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/commons-pool-1.5.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/commons-pool-1.5.4.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/dom4j-1.6.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/dom4j-1.6.1.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/el-api-2.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/el-api-2.2.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/geronimo-jta_1.1_spec-1.1.1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/geronimo-jta_1.1_spec-1.1.1.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/hibernate-commons-annotations-5.0.1.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/hibernate-commons-annotations-5.0.1.Final.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/hsqldb-2.3.4.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/hsqldb-2.3.4.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/jandex-2.0.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/jandex-2.0.0.Final.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/jboss-logging-3.3.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/jboss-logging-3.3.0.Final.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/jcl-over-slf4j-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/jcl-over-slf4j-1.7.21.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/jsr250-api-1.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/jsr250-api-1.0.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/log4j-api-2.6.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/log4j-api-2.6.2.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/log4j-core-2.6.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/log4j-core-2.6.2.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/slf4j-api-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/slf4j-api-1.7.21.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/slf4j-simple-1.7.21.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/slf4j-simple-1.7.21.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/spring-aop-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/spring-aop-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/spring-beans-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/spring-beans-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/spring-core-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/spring-core-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/spring-expression-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/spring-expression-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/spring-jdbc-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/spring-jdbc-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/4_ModularSpring/lib/spring-orm-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/lib/spring-orm-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/4_ModularSpring/mods/hibernate-core-5.2.2.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/mods/hibernate-core-5.2.2.Final.jar
--------------------------------------------------------------------------------
/4_ModularSpring/mods/hibernate-jpa-2.1-api-1.0.0.Final.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/mods/hibernate-jpa-2.1-api-1.0.0.Final.jar
--------------------------------------------------------------------------------
/4_ModularSpring/mods/javassist-3.20.0-GA.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/mods/javassist-3.20.0-GA.jar
--------------------------------------------------------------------------------
/4_ModularSpring/mods/javax.inject-1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/mods/javax.inject-1.jar
--------------------------------------------------------------------------------
/4_ModularSpring/mods/spring-context-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/mods/spring-context-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/4_ModularSpring/mods/spring-tx-4.3.2.RELEASE.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java9-modularity/java9-migration-demos/47948426b00061e1636e8d4c45f63f292011e81b/4_ModularSpring/mods/spring-tx-4.3.2.RELEASE.jar
--------------------------------------------------------------------------------
/4_ModularSpring/run.sh:
--------------------------------------------------------------------------------
1 | CLASSPATH=lib/antlr-2.7.7.jar:lib/cdi-api-1.1.jar:lib/classmate-1.3.0.jar:lib/commons-dbcp-1.4.jar:lib/commons-logging-1.2.jar:lib/commons-pool-1.5.4.jar:lib/dom4j-1.6.1.jar:lib/el-api-2.2.jar:lib/geronimo-jta_1.1_spec-1.1.1.jar:lib/hibernate-commons-annotations-5.0.1.Final.jar:lib/hsqldb-2.3.4.jar:lib/jandex-2.0.0.Final.jar:lib/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar:lib/jboss-logging-3.3.0.Final.jar:lib/jcl-over-slf4j-1.7.21.jar:lib/jsr250-api-1.0.jar:lib/log4j-api-2.6.2.jar:lib/log4j-core-2.6.2.jar:lib/slf4j-api-1.7.21.jar:lib/slf4j-simple-1.7.21.jar:lib/spring-aop-4.3.2.RELEASE.jar:lib/spring-beans-4.3.2.RELEASE.jar:lib/spring-core-4.3.2.RELEASE.jar:lib/spring-expression-4.3.2.RELEASE.jar:lib/spring-jdbc-4.3.2.RELEASE.jar:lib/spring-orm-4.3.2.RELEASE.jar
2 |
3 | javac -cp $CLASSPATH \
4 | --module-path mods \
5 | -d out \
6 | --module-source-path src \
7 | -m books.api,books.impl,bookstore,main
8 |
9 | cp $(find src -name '*.xml') out/main
10 |
11 | java -cp $CLASSPATH \
12 | --module-path mods:out \
13 | --add-modules java.xml.bind,java.sql,books.impl \
14 | --add-opens java.base/java.lang=javassist \
15 | -m main/main.Main
16 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/books.api/books/api/entities/Book.java:
--------------------------------------------------------------------------------
1 | package books.api.entities;
2 |
3 | public interface Book {
4 | int getId();
5 | String getTitle();
6 | double getPrice();
7 | }
8 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/books.api/books/api/service/BooksService.java:
--------------------------------------------------------------------------------
1 | package books.api.service;
2 |
3 | import books.api.entities.Book;
4 |
5 | public interface BooksService {
6 | Book getBook(int id);
7 | int createBook(String title, double price);
8 | }
9 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/books.api/module-info.java:
--------------------------------------------------------------------------------
1 | module books.api {
2 | exports books.api.entities;
3 | exports books.api.service;
4 | }
--------------------------------------------------------------------------------
/4_ModularSpring/src/books.impl/books-spring.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | books.impl.entities.BookEntity
30 |
31 |
32 |
33 |
34 |
35 | create
36 |
37 |
38 |
39 |
40 |
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/books.impl/books/impl/entities/BookEntity.java:
--------------------------------------------------------------------------------
1 | package books.impl.entities;
2 |
3 | import books.api.entities.Book;
4 | import javax.persistence.*;
5 |
6 | @Entity
7 | public class BookEntity implements Book {
8 | @Id @GeneratedValue
9 | private int id;
10 | private String title;
11 | private double price;
12 |
13 | public BookEntity() {}
14 |
15 | public BookEntity(String title, double price) {
16 | this.title = title;
17 | this.price = price;
18 | }
19 |
20 | public int getId() {
21 | return id;
22 | }
23 |
24 | public String getTitle() {
25 | return title;
26 | }
27 |
28 | public double getPrice() {
29 | return price;
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/books.impl/books/impl/service/HibernateBooksService.java:
--------------------------------------------------------------------------------
1 | package books.impl.service;
2 |
3 | import books.api.entities.Book;
4 | import books.api.service.BooksService;
5 | import books.impl.entities.BookEntity;
6 | import org.springframework.transaction.annotation.Transactional;
7 | import org.springframework.stereotype.Repository;
8 | import org.hibernate.SessionFactory;
9 | import javax.inject.Inject;
10 |
11 | @Repository
12 | @Transactional
13 | public class HibernateBooksService implements BooksService {
14 |
15 | @Inject
16 | private SessionFactory sessionFactory;
17 |
18 | public Book getBook(int id) {
19 | return sessionFactory.getCurrentSession().get(BookEntity.class, id);
20 | }
21 |
22 | public int createBook(String title, double price) {
23 |
24 | BookEntity entity = new BookEntity(title, price);
25 | sessionFactory.getCurrentSession().saveOrUpdate(entity);
26 |
27 | return entity.getId();
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/books.impl/module-info.java:
--------------------------------------------------------------------------------
1 | module books.impl {
2 | requires books.api;
3 |
4 | requires java.naming;
5 | requires spring.tx;
6 | requires javax.inject;
7 | requires hibernate.core;
8 | requires hibernate.jpa;
9 |
10 | opens books.impl.entities;
11 | opens books.impl.service;
12 | }
--------------------------------------------------------------------------------
/4_ModularSpring/src/bookstore/bookstore-spring.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/bookstore/bookstore/api/service/BookstoreService.java:
--------------------------------------------------------------------------------
1 | package bookstore.api.service;
2 |
3 | import books.api.service.BooksService;
4 |
5 | public interface BookstoreService {
6 | double calculatePrice(int... bookIds);
7 | }
8 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/bookstore/bookstore/impl/service/BookstoreServiceImpl.java:
--------------------------------------------------------------------------------
1 | package bookstore.impl.service;
2 |
3 | import java.util.Arrays;
4 | import books.api.entities.Book;
5 | import books.api.service.BooksService;
6 | import bookstore.api.service.BookstoreService;
7 | import org.springframework.stereotype.Component;
8 |
9 | @Component
10 | public class BookstoreServiceImpl implements BookstoreService {
11 |
12 | private static double TAX = 1.21d;
13 |
14 | private BooksService booksService;
15 |
16 | public BookstoreServiceImpl(BooksService booksService) {
17 | this.booksService = booksService;
18 | }
19 |
20 | public double calculatePrice(int... bookIds) {
21 | double total = Arrays
22 | .stream(bookIds)
23 | .mapToDouble(id -> booksService.getBook(id).getPrice())
24 | .sum();
25 |
26 | return total * TAX;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/bookstore/module-info.java:
--------------------------------------------------------------------------------
1 | module bookstore {
2 | requires books.api;
3 |
4 | requires spring.context;
5 |
6 | exports bookstore.api.service;
7 | opens bookstore.impl.service;
8 | }
--------------------------------------------------------------------------------
/4_ModularSpring/src/main/log4j2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/main/main/Main.java:
--------------------------------------------------------------------------------
1 | package main;
2 |
3 | import org.springframework.context.ApplicationContext;
4 | import org.springframework.context.support.ClassPathXmlApplicationContext;
5 | import books.api.service.BooksService;
6 | import books.api.entities.Book;
7 | import bookstore.api.service.BookstoreService;
8 |
9 | public class Main {
10 |
11 | public void start() {
12 | System.out.println("Starting...");
13 |
14 | ApplicationContext context =
15 | new ClassPathXmlApplicationContext(new String[] {"classpath:/bookstore-spring.xml","classpath:/books-spring.xml"});
16 |
17 |
18 | BooksService booksService = context.getBean(BooksService.class);
19 | BookstoreService store = context.getBean(BookstoreService.class);
20 |
21 | // Create some books
22 | int id1 = booksService.createBook("Java 9 Modularity", 45.0d);
23 | int id2 = booksService.createBook("Modular Cloud Apps with OSGi", 40.0d);
24 | printf("Created books with id [%d, %d]", id1, id2);
25 |
26 | // Retrieve them again
27 | Book book1 = booksService.getBook(id1);
28 | Book book2 = booksService.getBook(id2);
29 | printf("Retrieved books:\n %d: %s [%.2f]\n %d: %s [%.2f]",
30 | id1, book1.getTitle(), book1.getPrice(), id2, book2.getTitle(), book2.getPrice());
31 |
32 | // Use the other service to calculate a total
33 | double total = store.calculatePrice(id1, id2);
34 | printf("Total price (with tax): %.2f", total);
35 |
36 | }
37 |
38 | public static void main(String[] args) {
39 | new Main().start();
40 | }
41 |
42 | private void printf(String msg, Object... args) {
43 | System.out.println(String.format(msg + "\n", args));
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/4_ModularSpring/src/main/module-info.java:
--------------------------------------------------------------------------------
1 | module main {
2 | requires spring.context;
3 | requires books.api;
4 | requires bookstore;
5 | }
--------------------------------------------------------------------------------
/5_MavenAndServices/books/books.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/5_MavenAndServices/books/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | spring-hibernate-example
7 | javamodularity
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | books
13 |
14 |
15 |
16 | org.apache.maven.plugins
17 | maven-compiler-plugin
18 |
19 | 9
20 | 9
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | org.hibernate
29 | hibernate-core
30 | 5.2.11.Final
31 |
32 |
33 | org.jboss.spec.javax.transaction
34 | jboss-transaction-api_1.2_spec
35 | 1.0.2.Final-SNAPSHOT
36 |
37 |
38 |
39 | org.javassist
40 | javassist
41 | 3.22.0-CR2
42 |
43 |
44 |
45 | com.h2database
46 | h2
47 | 1.3.176
48 |
49 |
50 |
51 |
52 |
53 | org.jboss.repository.releases
54 | JBoss Maven Release Repository
55 | https://repository.jboss.org/nexus/content/repositories/releases
56 |
57 |
58 |
--------------------------------------------------------------------------------
/5_MavenAndServices/books/src/main/java/books/api/entities/Book.java:
--------------------------------------------------------------------------------
1 | package books.api.entities;
2 |
3 | public interface Book {
4 | int getId();
5 | String getTitle();
6 | double getPrice();
7 | }
8 |
--------------------------------------------------------------------------------
/5_MavenAndServices/books/src/main/java/books/api/service/BooksService.java:
--------------------------------------------------------------------------------
1 | package books.api.service;
2 |
3 | import books.api.entities.Book;
4 |
5 | public interface BooksService {
6 | Book getBook(int id);
7 | int createBook(String title, double price);
8 | }
9 |
--------------------------------------------------------------------------------
/5_MavenAndServices/books/src/main/java/books/impl/entities/BookEntity.java:
--------------------------------------------------------------------------------
1 | package books.impl.entities;
2 |
3 | import books.api.entities.Book;
4 | import javax.persistence.*;
5 |
6 | @Entity
7 | public class BookEntity implements Book {
8 | @Id @GeneratedValue
9 | private int id;
10 | private String title;
11 | private double price;
12 |
13 | public BookEntity() {}
14 |
15 | public BookEntity(String title, double price) {
16 | this.title = title;
17 | this.price = price;
18 | }
19 |
20 | public int getId() {
21 | return id;
22 | }
23 |
24 | public String getTitle() {
25 | return title;
26 | }
27 |
28 | public double getPrice() {
29 | return price;
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/5_MavenAndServices/books/src/main/java/books/impl/service/HibernateBooksService.java:
--------------------------------------------------------------------------------
1 | package books.impl.service;
2 |
3 | import books.api.entities.Book;
4 | import books.api.service.BooksService;
5 | import books.impl.entities.BookEntity;
6 |
7 | import javax.persistence.EntityManager;
8 | import javax.persistence.EntityManagerFactory;
9 | import javax.persistence.Persistence;
10 | import javax.persistence.TypedQuery;
11 |
12 | public class HibernateBooksService implements BooksService {
13 | private EntityManagerFactory entityManagerFactory;
14 |
15 | public HibernateBooksService() {
16 | this.entityManagerFactory = Persistence.createEntityManagerFactory("books");
17 | }
18 |
19 | public Book getBook(int id) {
20 | EntityManager entityManager = entityManagerFactory.createEntityManager();
21 |
22 | TypedQuery query = entityManager.createQuery("SELECT book from BookEntity book where book.id = :id", Book.class);
23 | query.setParameter("id", id);
24 | return query.getSingleResult();
25 | }
26 |
27 | public int createBook(String title, double price) {
28 |
29 | BookEntity entity = new BookEntity(title, price);
30 | EntityManager entityManager = entityManagerFactory.createEntityManager();
31 | entityManager.getTransaction().begin();
32 | entityManager.persist(entity);
33 | entityManager.getTransaction().commit();
34 |
35 | return entity.getId();
36 | }
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/5_MavenAndServices/books/src/main/java/module-info.java:
--------------------------------------------------------------------------------
1 | module books {
2 | requires hibernate.jpa;
3 | exports books.api.entities;
4 | exports books.api.service;
5 |
6 | opens books.impl.entities;
7 |
8 | provides books.api.service.BooksService with books.impl.service.HibernateBooksService;
9 | }
--------------------------------------------------------------------------------
/5_MavenAndServices/books/src/main/resources/META-INF/persistence.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 | books.impl.entities.BookEntity
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/5_MavenAndServices/bookstore/bookstore.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/5_MavenAndServices/bookstore/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | spring-hibernate-example
7 | javamodularity
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | bookstore
13 |
14 |
15 |
16 | org.apache.maven.plugins
17 | maven-compiler-plugin
18 |
19 | 9
20 | 9
21 |
22 |
23 |
24 |
25 |
26 |
27 | javamodularity
28 | books
29 | 1.0-SNAPSHOT
30 |
31 |
32 |
--------------------------------------------------------------------------------
/5_MavenAndServices/bookstore/src/main/java/bookstore/service/api/BookstoreService.java:
--------------------------------------------------------------------------------
1 | package bookstore.service.api;
2 |
3 | import books.api.service.BooksService;
4 |
5 | public interface BookstoreService {
6 | double calculatePrice(int... bookIds);
7 | }
8 |
--------------------------------------------------------------------------------
/5_MavenAndServices/bookstore/src/main/java/bookstore/service/impl/BookstoreServiceImpl.java:
--------------------------------------------------------------------------------
1 | package bookstore.service.impl;
2 |
3 | import java.util.Arrays;
4 | import java.util.ServiceLoader;
5 |
6 | import books.api.service.BooksService;
7 | import bookstore.service.api.BookstoreService;
8 |
9 | public class BookstoreServiceImpl implements BookstoreService {
10 |
11 | private static double TAX = 1.21d;
12 |
13 | private BooksService booksService;
14 |
15 | public BookstoreServiceImpl() {
16 | this.booksService = ServiceLoader.load(BooksService.class).findFirst().get();
17 | }
18 |
19 | public double calculatePrice(int... bookIds) {
20 | double total = Arrays
21 | .stream(bookIds)
22 | .mapToDouble(id -> booksService.getBook(id).getPrice())
23 | .sum();
24 |
25 | return total * TAX;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/5_MavenAndServices/bookstore/src/main/java/module-info.java:
--------------------------------------------------------------------------------
1 | module bookstore {
2 | requires books;
3 |
4 | exports bookstore.service.api;
5 |
6 | uses books.api.service.BooksService;
7 |
8 | provides bookstore.service.api.BookstoreService with bookstore.service.impl.BookstoreServiceImpl;
9 | }
--------------------------------------------------------------------------------
/5_MavenAndServices/main/main.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/5_MavenAndServices/main/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | spring-hibernate-example
7 | javamodularity
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | main
13 |
14 |
15 |
16 | org.apache.maven.plugins
17 | maven-compiler-plugin
18 |
19 | 9
20 | 9
21 |
22 |
23 |
24 |
25 |
26 |
27 | javamodularity
28 | books
29 | 1.0-SNAPSHOT
30 |
31 |
32 | javamodularity
33 | bookstore
34 | 1.0-SNAPSHOT
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/5_MavenAndServices/main/src/main/java/main/Main.java:
--------------------------------------------------------------------------------
1 | package main;
2 |
3 | import books.api.entities.Book;
4 | import books.api.service.BooksService;
5 | import bookstore.service.api.BookstoreService;
6 |
7 | import java.util.ServiceLoader;
8 |
9 | public class Main {
10 |
11 | public void start() {
12 | System.out.println("Starting...");
13 |
14 | BooksService booksService = ServiceLoader.load(BooksService.class).findFirst().get();
15 | BookstoreService store = ServiceLoader.load(BookstoreService.class).findFirst().get();
16 |
17 | // Create some books
18 | int id1 = booksService.createBook("Java 9 Modularity", 45.0d);
19 | int id2 = booksService.createBook("Modular Cloud Apps with OSGi", 40.0d);
20 | printf("Created books with id [%d, %d]", id1, id2);
21 |
22 | // Use the other service to calculate a total
23 | double total = store.calculatePrice(id1, id2);
24 | printf("Total price (with tax): %.2f", total);
25 |
26 | System.exit(0);
27 |
28 | }
29 |
30 | public static void main(String[] args) {
31 | new Main().start();
32 | }
33 |
34 | private void printf(String msg, Object... args) {
35 | System.out.println(String.format(msg + "\n", args));
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/5_MavenAndServices/main/src/main/java/module-info.java:
--------------------------------------------------------------------------------
1 | module main {
2 | requires books;
3 | requires bookstore;
4 |
5 | uses bookstore.service.api.BookstoreService;
6 | uses books.api.service.BooksService;
7 | }
--------------------------------------------------------------------------------
/5_MavenAndServices/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | javamodularity
8 | spring-hibernate-example
9 | pom
10 | 1.0-SNAPSHOT
11 |
12 | main
13 | books
14 | bookstore
15 |
16 |
17 |
18 |
19 |
20 |
21 | org.apache.maven.plugins
22 | maven-compiler-plugin
23 | 3.6.1
24 |
25 | 9
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/5_MavenAndServices/spring-hibernate-example.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Migrating to Java 9 Modules
2 |
3 | This repo contains the same application in 4 different states:
4 |
5 | 1. A classic Spring/Hibernate application running on the classpath
6 | 2. Reimplementation of this app with Java 9 modules *without* using the Spring/Hibernate libs
7 | 3. A port of the classpath based application to a single module running on Java 9 (with automatic modules)
8 | 4. Fully modularized version of the Spring/Hibernate app (with automatic modules)
9 |
10 | These examples are explained in more detail in the O'Reilly book [Java 9 Modularity](http://shop.oreilly.com/product/0636920049494.do)
11 |
12 | At Devoxx, this code was used for live demo's: https://www.youtube.com/watch?v=oy3202OFPpM
13 |
--------------------------------------------------------------------------------