I have a Spring MVC web project. I want to generate some xml files based on some data stored in my database. This program will be run once or a few times everyday. As the data size grows, the program may take longer to run. The best way to do this is to write a JAR executable and feed it to Amazon to Elastic MapReduce.
First generate a Maven project called maventest. If you do not have maven set up, read Install Maven 3 on Amazon EC2 Ubuntu.
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.maventest -DartifactId=maventestResources files are located in src/main/resources/.
Spring requires a context xml file that defines how classes are instantiated. Create a file called applicationContext.xml in src/main/resources.
Paste the following into the applicationContext.xml file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xmlns:aop="http://www.springframework.org/schema/aop" | |
xmlns:context="http://www.springframework.org/schema/context" | |
xmlns:tx="http://www.springframework.org/schema/tx" | |
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd | |
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd | |
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd | |
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" | |
default-lazy-init="true"> | |
<!-- Activates scanning of @Service --> | |
<context:component-scan base-package="com.mycompany.package1, com.mycompany.package2"/> | |
<!-- Activates scanning of @Autowired --> | |
<context:annotation-config/> | |
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> | |
<!-- Hibernate SessionFactory --> | |
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> | |
<property name="dataSource" ref="dataSource"/> | |
<property name="packagesToScan" value="com.mycompany.model"/> | |
<property name="hibernateProperties"> | |
<value> | |
hibernate.dialect=${hibernate.dialect} | |
hibernate.query.substitutions=true 'Y', false 'N' | |
hibernate.cache.use_second_level_cache=true | |
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider | |
</value> | |
<!-- Turn batching off for better error messages under PostgreSQL --> | |
<!-- hibernate.jdbc.batch_size=0 --> | |
</property> | |
</bean> | |
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> | |
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> | |
<property name="sessionFactory" ref="sessionFactory"/> | |
</bean> | |
<tx:annotation-driven transaction-manager="transactionManager" /> | |
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> | |
<property name="driverClassName" value="${jdbc.driverClassName}"/> | |
<property name="url" value="${jdbc.url}"/> | |
<property name="username" value="${jdbc.username}"/> | |
<property name="password" value="${jdbc.password}"/> | |
<property name="maxActive" value="100"/> | |
<property name="maxWait" value="1000"/> | |
<property name="poolPreparedStatements" value="true"/> | |
<property name="defaultAutoCommit" value="true"/> | |
</bean> | |
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> | |
<property name="ignoreUnresolvablePlaceholders" value="true"/> | |
<property name="locations"> | |
<list> | |
<value>classpath:jdbc.properties</value> | |
</list> | |
</property> | |
</bean> | |
</beans> |
Create a file called jdbc.properties in src/main/resources. We will be connecting to a MySQL database.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jdbc.driverClassName=com.mysql.jdbc.Driver | |
jdbc.url=jdbc:mysql://localhost/mytestdatabase?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true | |
jdbc.username=root | |
jdbc.password=root | |
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect | |
# Needed by Hibernate3 Maven Plugin defined in pom.xml | |
hibernate.connection.username=root | |
hibernate.connection.password=root | |
hibernate.connection.url=jdbc:mysql://localhost/mytestdatabase?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true | |
hibernate.connection.driver_class=com.mysql.jdbc.Driver |
My whole project is called myproject. It has the Spring MVC web project has the package name com.mycompany.package1 and artifactId mywebproject. This cron program will have the package name com.mycompany.package2 with artifactId cron.
We will use the maven-jar-plugin to define the location of our main class.
< plugin>
< groupId>org.apache.maven.plugins< /groupId>
< artifactId>maven-jar-plugin< /artifactId>
< configuration>
< archive>
< manifest>
< mainClass>com.mycompany.package2.App< /mainClass>
< /manifest>
< /archive>
< /configuration>
< /plugin>
In order to package all the dependencies as one jar file, we will use maven-shade-plugin. Sometimes, spring.schemas and spring.handlers files can be overwritten. Examine the transformers tag below to see that the content of these files will be appended.
We will now include all the dependencies in the pom.xml file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0"?> | |
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | |
<modelVersion>4.0.0</modelVersion> | |
<parent> | |
<groupId>com.mycompany</groupId> | |
<artifactId>myproject</artifactId> | |
<version>1.0-SNAPSHOT</version> | |
</parent> | |
<groupId>com.mycompany.package2</groupId> | |
<artifactId>cron</artifactId> | |
<version>1.0-SNAPSHOT</version> | |
<name>onix-generator</name> | |
<url>http://maven.apache.org</url> | |
<properties> | |
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |
<spring.version>3.2.1.RELEASE</spring.version> | |
<jdbc.groupId>mysql</jdbc.groupId> | |
<jdbc.artifactId>mysql-connector-java</jdbc.artifactId> | |
<jdbc.version>5.1.14</jdbc.version> | |
<hibernate.version>3.6.10.Final</hibernate.version> | |
<javamail.version>1.4.1</javamail.version> | |
<log4j.version>1.2.16</log4j.version> | |
<springmodules.validation.version>0.8</springmodules.validation.version> | |
<spring.security.version>3.1.2.RELEASE</spring.security.version> | |
<aspectj.version>1.6.10</aspectj.version> | |
<cxf.version>2.5.3</cxf.version> | |
</properties> | |
<build> | |
<plugins> | |
<plugin> | |
<groupId>org.apache.maven.plugins</groupId> | |
<artifactId>maven-jar-plugin</artifactId> | |
<configuration> | |
<archive> | |
<manifest> | |
<mainClass>com.wundrbooks.onix.App</mainClass> | |
</manifest> | |
</archive> | |
</configuration> | |
</plugin> | |
<plugin> | |
<groupId>org.apache.maven.plugins</groupId> | |
<artifactId>maven-compiler-plugin</artifactId> | |
<configuration> | |
<source>1.7</source> | |
<target>1.7</target> | |
</configuration> | |
</plugin> | |
<plugin> | |
<groupId>org.apache.maven.plugins</groupId> | |
<artifactId>maven-shade-plugin</artifactId> | |
<version>2.1</version> | |
<executions> | |
<execution> | |
<phase>package</phase> | |
<goals> | |
<goal>shade</goal> | |
</goals> | |
<configuration> | |
<transformers> | |
<transformer implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer"/> | |
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> | |
<resource>META-INF/spring.handlers</resource> | |
</transformer> | |
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> | |
<resource>META-INF/spring.schemas</resource> | |
</transformer> | |
</transformers> | |
</configuration> | |
</execution> | |
</executions> | |
</plugin> | |
</plugins> | |
</build> | |
<dependencies> | |
<dependency> | |
<groupId>junit</groupId> | |
<artifactId>junit</artifactId> | |
<version>3.8.1</version> | |
<scope>test</scope> | |
</dependency> | |
<dependency> | |
<groupId>${jdbc.groupId}</groupId> | |
<artifactId>${jdbc.artifactId}</artifactId> | |
<version>${jdbc.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>log4j</groupId> | |
<artifactId>log4j</artifactId> | |
<version>${log4j.version}</version> | |
<exclusions> | |
<exclusion> | |
<artifactId>mail</artifactId> | |
<groupId>javax.mail</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>jms</artifactId> | |
<groupId>javax.jms</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>jmxtools</artifactId> | |
<groupId>com.sun.jdmk</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>jmxri</artifactId> | |
<groupId>com.sun.jmx</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>org.apache.cxf</groupId> | |
<artifactId>cxf-rt-frontend-jaxrs</artifactId> | |
<version>${cxf.version}</version> | |
<exclusions> | |
<exclusion> | |
<artifactId>spring-core</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>spring-web</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>wstx-asl</artifactId> | |
<groupId>org.codehaus.woodstox</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>org.apache.cxf</groupId> | |
<artifactId>cxf-common-utilities</artifactId> | |
<version>${cxf.version}</version> | |
<exclusions> | |
<exclusion> | |
<artifactId>spring-beans</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>spring-context</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>spring-core</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>org.apache.cxf</groupId> | |
<artifactId>cxf-rt-transports-http</artifactId> | |
<version>${cxf.version}</version> | |
<exclusions> | |
<exclusion> | |
<artifactId>spring-web</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>org.apache.cxf</groupId> | |
<artifactId>cxf-rt-frontend-jaxws</artifactId> | |
<version>${cxf.version}</version> | |
<exclusions> | |
<exclusion> | |
<artifactId>wstx-asl</artifactId> | |
<groupId>org.codehaus.woodstox</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>org.aspectj</groupId> | |
<artifactId>aspectjweaver</artifactId> | |
<version>${aspectj.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.aspectj</groupId> | |
<artifactId>aspectjrt</artifactId> | |
<version>${aspectj.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-context-support</artifactId> | |
<version>${spring.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-test</artifactId> | |
<version>${spring.version}</version> | |
<optional>true</optional> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-aop</artifactId> | |
<version>${spring.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-jdbc</artifactId> | |
<version>${spring.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-orm</artifactId> | |
<version>${spring.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-aspects</artifactId> | |
<version>${spring.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-context-support</artifactId> | |
<version>${spring.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-webmvc</artifactId> | |
<version>${spring.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework.security</groupId> | |
<artifactId>spring-security-core</artifactId> | |
<version>${spring.security.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework.security</groupId> | |
<artifactId>spring-security-config</artifactId> | |
<version>${spring.security.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework.security</groupId> | |
<artifactId>spring-security-taglibs</artifactId> | |
<version>${spring.security.version}</version> | |
<exclusions> | |
<exclusion> | |
<artifactId>spring-web</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>spring-support</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>org.springmodules</groupId> | |
<artifactId>spring-modules-validation</artifactId> | |
<version>${springmodules.validation.version}</version> | |
<exclusions> | |
<exclusion> | |
<artifactId>spring</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>spring-support</artifactId> | |
<groupId>org.springframework</groupId> | |
</exclusion> | |
<exclusion> | |
<artifactId>xml-apis</artifactId> | |
<groupId>xml-apis</groupId> | |
</exclusion> | |
</exclusions> | |
</dependency> | |
<dependency> | |
<groupId>com.mycompany.package1</groupId> | |
<artifactId>mywebproject</artifactId> | |
<version>1.0-SNAPSHOT</version> | |
</dependency> | |
</dependencies> | |
</project> |
mvn clean packageIf the package command fails, it may be complaining that it can't find the com.mycompany.package1.mywebproject project.
You can do a mvn:install for mywebproject. This will install mywebproject to the local maven repository. It is located under /Users/{your_name}/.m2. Remember to compile mywebproject as JAR by setting it in the pom.xml. If you ever suspect that some classes are missing or the build is not quite correct. It's highly likely that mywebproject in the local repository is not up-to-date.
The jar file is located in the target folder. Run the jar
java -jar maventest-1-0-SNAPSHOT
No comments:
Post a Comment