├── .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 | --------------------------------------------------------------------------------