Basic Java EE with Apache Maven
some-parent
다른 모듈들에서 사용할 dependency/plugin 등을 정리하는 모듈이다. java-ee-api
와 derby
, h2
등의 메모리 DB, 그리고, eclipselink
, hibernate-core
, openejb-core
등이 정의되었다.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>some.group</groupId> <artifactId>some-parent</artifactId> <version>0.1.0-SNAPSHOT</version> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <version.org.apache.tomee>7.0.2</version.org.apache.tomee> <version.org.eclipse.persistence>2.6.4</version.org.eclipse.persistence> <version.org.glassfish.jersey>2.25</version.org.glassfish.jersey> <version.org.glassfish.jersey.security>${version.org.glassfish.jersey}</version.org.glassfish.jersey.security> <version.org.glassfish.jersey.test-framework>${version.org.glassfish.jersey}</version.org.glassfish.jersey.test-framework> <version.org.wildfly.swarm>2017.1.1</version.org.wildfly.swarm> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.8</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.193</version> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.5</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <version>10.13.1.1</version> </dependency> <dependency> <groupId>org.apache.tomee</groupId> <artifactId>openejb-core</artifactId> <version>${version.org.apache.tomee}</version> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>${version.org.eclipse.persistence}</version> </dependency> <dependency> <groupId>org.gavaghan</groupId> <artifactId>geodesy</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b08</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.6.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.4.0.CR1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.22</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.10</version> </dependency> </dependencies> </dependencyManagement> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.19.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.10.4</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.7</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> <version>2.9</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> </plugin> <plugin> <groupId>org.bsc.maven</groupId> <artifactId>maven-processor-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.7</version> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.8</version> </plugin> </plugins> </pluginManagement> </build> </project>
some-entities
Persistence-Unit 에 해당하는 모듈이다. 중요한 점으로 이 묘듈은 persistence.xml
파일을 포함하지 않는다는 것이다. persistence.xml
파일은 최종 application 에서 정의한다.
javaee-api
우선적으로 필요한 의존성은 javaee-api
이다. provided
scope로 선언한다.
... <groupId>some</groupId> <artifactId>some-entities</artifactId> <version>0.1.0-SNAPSHOT</version> <packaging>jar</packaging> ... <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <scope>provided</scope> </dependency> </dependencies> ... </project>
BaseEntity.java
필요에 따라서 다른 entity들이 상속할 수 있는 기본클래스를 선언할 수도 있다.
@MappedSuperclass public abstract class BaseEntity implements Serializable { // ... @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = COLUMN_NAME_ID, nullable = false, updatable = false) @XmlAttribute private Long id; // ... }
metamodel generation
JPA Metamodel 들을 생성한다. maven-processor-plugin
과 hibernate-jpamodelgen
을 사용한다.
... <build> ... <plugins> ... <plugin> <groupId>org.bsc.maven</groupId> <artifactId>maven-processor-plugin</artifactId> <executions> <execution> <id>generate-metamodels</id> <goals> <goal>process</goal> </goals> <phase>generate-sources</phase> <configuration> <processors> <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor> </processors> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>5.2.6.Final</version> </dependency> </dependencies> </plugin> ... </plugins> ... </build> ...
src/test/resources/META-INF/persistence.xml
단위시험을 위해 in-memory database를 이용하는 persistence.xml
파일을 준비하자.
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="somePU" transaction-type="RESOURCE_LOCAL"> <provider>${provider}</provider> <class>com.mycompany.some.Some</class> ... <validation-mode>CALLBACK</validation-mode> <properties> <property name="javax.persistence.jdbc.driver" value="${javax.persistence.jdbc.driver}"/> <property name="javax.persistence.jdbc.url" value="${javax.persistence.jdbc.url}"/> <property name="javax.persistence.schema-generation.database.action" value="create"/> </properties> </persistence-unit> </persistence>
validation-mode
를 CALLBACK
으로 설정했으므로 validation framework을 추가해 줘야 한다.
... <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <scope>test</scope> </dependency> ...
자 이제 h2
, derby
등의 database와 eclipselinke
, hibernate-core
등의 JPA provider 등을 선택적으로 사용할 수 있는 profile 들을 작성한다.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ... <profiles> <profile> <id>derby</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <javax.persistence.jdbc.driver>org.apache.derby.jdbc.EmbeddedDriver</javax.persistence.jdbc.driver> <javax.persistence.jdbc.url>jdbc:derby:memory:someDB;create=true</javax.persistence.jdbc.url> </properties> <dependencies> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <scope>test</scope> </dependency> </dependencies> </profile> <profile> <id>h2</id> <properties> <javax.persistence.jdbc.driver>org.h2.Driver</javax.persistence.jdbc.driver> <javax.persistence.jdbc.url>jdbc:h2:mem:someDB</javax.persistence.jdbc.url> </properties> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency> </dependencies> </profile> <profile> <id>eclipselink</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> </properties> <dependencies> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <scope>test</scope> </dependency> </dependencies> </profile> <profile> <id>hibernate</id> <properties> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> </properties> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <scope>test</scope> </dependency> </dependencies> </profile> </profiles> </project>
기본적으로 derby
와 eclipselink
를 activeByDefault
로 설정하였다. 다음과 같이 profile을 바꿔가면서 시험할 수 있다.
$ mvn -Ph2,eclipselink test $ mvn -Pderby,hibernate test