Sunday, November 08, 2015

Maven project with Spring, Log4j2 and properties

This a reference I use to quickly come up with a standalone app (no server) that uses Spring Boot, Log4j2 and a properties file.

The pom.xml file.

<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/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.testproject</groupId>
   <artifactId>TestProject</artifactId>
   <packaging>jar</packaging>
   <version>1.0-SNAPSHOT</version>
   <name>TestProject</name>
   <url>http://maven.apache.org</url>

   <properties>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
      <jodatime.version>2.5</jodatime.version>
      <junit.version>4.12</junit.version>
      <log4j.version>2.4.1</log4j.version>
      <spring.boot.version>1.2.5.RELEASE</spring.boot.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>${junit.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-core</artifactId>
         <version>${log4j.version}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot</artifactId>
         <version>${spring.boot.version}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-autoconfigure</artifactId>
         <version>${spring.boot.version}</version>
      </dependency>
   </dependencies>

</project>

The configuration class that launches the app.

package org.testproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * Configuration and runner for the test app.
 */
@Configuration
@ComponentScan(basePackages = { "org.testproject.*" })
@EnableAutoConfiguration
public final class TestApp {

   /**
    * Launch app.
    *
    * @param args
    *           not used
    */
   public static void main(final String[] args) {
      SpringApplication.run(Runner.class, args);
   }

}

The runner - the class that does the actual work.

package org.testproject;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/**
 * Read in a message file from Touch Copy and transform the contents to be diary
 * ready.
 *
 * @author RobertMarkBram
 */
@Component
@PropertySources(value = {@PropertySource("classpath:/application.properties")})
public final class Runner implements CommandLineRunner {

   /** Logger for this class. */
   static final Logger LOG = LogManager.getLogger(Runner.class
         .getName());

   /** Use to access properties. */
   @Autowired
   private Environment env;

   /* (non-Javadoc)
    * @see org.springframework.boot.CommandLineRunner#run(java.lang.String[])
    */
   @Override
   public void run(final String... args) throws Exception {
      String testproperty = env.getProperty("testProperty");
      LOG.info(testproperty);
   }

}

The application property file.

testProperty=Hello World

The log4j2 configuration - note that number 2 is there.. this not old log4j anymore.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
      <Console name="CONSOLE" target="SYSTEM_OUT">
         <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
      </Console>
   </Appenders>
   <Loggers>
      <logger name="org.testproject" level="DEBUG" />
      <Root level="ERROR">
         <AppenderRef ref="CONSOLE"/>
      </Root>
   </Loggers>
</Configuration>