diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
new file mode 100644
index 0000000000..ad49cceb9d
--- /dev/null
+++ b/core-java-modules/pom.xml
@@ -0,0 +1,19 @@
+
+
+ 4.0.0
+ core-java-modules
+ core-java-modules
+ pom
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+ pre-jpms
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/pre-jpms/pom.xml b/core-java-modules/pre-jpms/pom.xml
new file mode 100644
index 0000000000..169cd21f3e
--- /dev/null
+++ b/core-java-modules/pre-jpms/pom.xml
@@ -0,0 +1,74 @@
+
+ 4.0.0
+ pre-jpms
+ 0.0.1-SNAPSHOT
+ jar
+ pre-jpms
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.25
+
+
+
+ pre-jpms
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.8
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ 3.1.1
+
+
+ copy-dependencies
+ package
+
+ copy-dependencies
+
+
+
+ ${project.build.directory}/dependency-jars/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ com.baeldung.prejpms.App
+ true
+ dependency-jars/
+
+
+
+
+
+
+
+
+ UTF-8
+
+
diff --git a/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/App.java b/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/App.java
new file mode 100644
index 0000000000..1afaae30e4
--- /dev/null
+++ b/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/App.java
@@ -0,0 +1,77 @@
+package com.baeldung.prejpms;
+
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.sun.crypto.provider.SunJCE;
+
+import sun.misc.BASE64Encoder;
+import sun.reflect.Reflection;
+
+public class App {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
+
+ public static void main(String[] args) throws Exception {
+
+ getCrytpographyProviderName();
+ getCallStackClassNames();
+ getXmlFromObject(new Book(100, "Java Modules Architecture"));
+ getBase64EncodedString("Java");
+ }
+
+ private static void getCrytpographyProviderName() {
+ try {
+ LOGGER.info("1. JCE Provider Name: {}\n", new SunJCE().getName());
+ } catch (Throwable e) {
+ LOGGER.error(e.toString());
+ }
+ }
+
+ private static void getCallStackClassNames() {
+ try {
+ StringBuffer sbStack = new StringBuffer();
+ int i = 0;
+ Class> caller = Reflection.getCallerClass(i++);
+ do {
+ sbStack.append(i + ".")
+ .append(caller.getName())
+ .append("\n");
+ caller = Reflection.getCallerClass(i++);
+ } while (caller != null);
+ LOGGER.info("2. Call Stack:\n{}", sbStack);
+ } catch (Throwable e) {
+ LOGGER.error(e.toString());
+ }
+ }
+
+ private static void getXmlFromObject(Book book) {
+ try {
+ Marshaller marshallerObj = JAXBContext.newInstance(Book.class)
+ .createMarshaller();
+ marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+
+ StringWriter sw = new StringWriter();
+ marshallerObj.marshal(book, sw);
+ LOGGER.info("3. Xml for Book object:\n{}", sw);
+ } catch (Throwable e) {
+ LOGGER.error(e.toString());
+ }
+
+ }
+
+ private static void getBase64EncodedString(String inputString) {
+ try {
+ String encodedString = new BASE64Encoder().encode(inputString.getBytes());
+ LOGGER.info("4. Base Encoded String: {}", encodedString);
+ } catch (Throwable e) {
+ LOGGER.error(e.toString());
+ }
+ }
+}
diff --git a/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/Book.java b/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/Book.java
new file mode 100644
index 0000000000..6780c73738
--- /dev/null
+++ b/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/Book.java
@@ -0,0 +1,37 @@
+package com.baeldung.prejpms;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "book")
+public class Book {
+ private long id;
+ private String name;
+
+ public Book() {
+ }
+
+ public Book(long id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ @XmlAttribute
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @XmlElement(name = "title")
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Long getId() {
+ return id;
+ }
+}
diff --git a/core-java-modules/pre-jpms/src/main/resources/logback.xml b/core-java-modules/pre-jpms/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7c5914e58e
--- /dev/null
+++ b/core-java-modules/pre-jpms/src/main/resources/logback.xml
@@ -0,0 +1,10 @@
+
+
+
+ [%level] %msg%n
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 745275488c..64710a39a6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -398,6 +398,7 @@
core-java-lang
core-java-lang-oop
core-java-lang-oop-2
+ core-java-modules
core-java-networking
core-java-perf
core-java-sun
@@ -1069,6 +1070,7 @@
core-java-lang
core-java-lang-oop
core-java-lang-oop-2
+ core-java-modules
core-java-networking
core-java-perf
core-java-sun