eclipse通过maven建立java se工程配置log4j,打包成zip,将jar包和配置文件分开,并以bat和sh文件启动java程序


一.新建maven的java工程

1.eclipse里file-new-other,选择maven Project 

2.选中 Use default Workspace location,然后 next

3.选择maven-archetype-quitstart,然后next

4.填入工程信息,然后finish

6.新建好的工程结构如图

7.将test下和java下自动生成的java类删除,右键build-path选择好jdk版本,整个工程就建好了。

二.配置log4j

1.将工程目录调整成下图(这步其实是为下面maven打包做准备)

2.通过maven导入log4j,jar

在pom.xml的里加入以下语句

    
	org.slf4j
	slf4j-log4j12
	1.6.0
        

3.在src/conf下面新建文件log4j.properties,内容如下:

 ### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制台###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出debug级别以上的日志到E://logs/log.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出error级别以上的日志到E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

4.新建日志测试类,内容如下:

package com.zhuzhixi.zhuzhixiDataMaker.Test;

import org.apache.log4j.Logger;

public class LogTest {

	private static Logger logger = Logger.getLogger(LogTest.class);  
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		  // 记录debug级别的信息  
        logger.debug("This is debug message.");  
        // 记录info级别的信息  
        logger.info("This is info message.");  
        // 记录error级别的信息  
        logger.error("This is error message."); 
	}

}

5.结果如下:

5.1在控制台打出如下信息

5.2在e盘的logs文件夹下出现两个文件

内容分别如下:

三.配置maven-assembly-plugin并打包

1.在pon.xml里面更改为下面的内容(工程项目的文件结构在上面)



	4.0.0
	com.zhuzhixi
	zhuzhixiDataMaker
	jar
	0.0.1-SNAPSHOT
	

	
		UTF-8
	

	
		
		
			org.slf4j
			slf4j-log4j12
			1.6.0
		
	

	
		
			
				src/main/conf
			
			
				src/main/resources
			
		
		
			
				org.apache.maven.plugins
				maven-resources-plugin
				2.7
				
					UTF-8
				
			
			
				org.apache.maven.plugins
				maven-assembly-plugin
				2.5.5
				
					UTF-8
					false
					
						src/main/assemble/package.xml
					
				
			
			
				org.apache.maven.plugins
				maven-compiler-plugin
				3.3
				
					1.8
					1.8
					true
				
			
		
	



2.src/main/assemble目录下的package.xml内容为:


    package
    
        zip
    
    true
    
        
            src/main/bin
            bin
        
        
            src/main/conf
            conf
        
        
            src/main/logs
            logs
        
        
            src/main/work
            work
        
    
    
        
            lib
            runtime
        
    

3.在src/main/bin下面新建文件start.bat和start.sh两个文件,用于windows和linux里启动java程序

start.bat的内容如下:

@echo off

SET base=%~dp0
SET main_class="com.zhuzhixi.zhuzhixiDataMaker.Test.LogTest"

SET conf=%base%..\conf
SET libs=%base%..\lib
SET class_path=%conf%;%libs%\*;
java -classpath %class_path% %main_class%
@pause

start.sh的内容如下:

#!/bin/bash


script_path=$(cd "$(dirname "$0")"; pwd)
lib_path=${script_path}/../lib
main_class="com.zhuzhixi.zhuzhixiDataMaker.Test.LogTest"
conf_path=${script_path}/../etc/conf

CLASSPATH="${conf_path}"
for jar in $lib_path/*.jar
do
	if [ "$CLASSPATH" = "" ] ; then
		CLASSPATH=$jar
	else
		CLASSPATH=$CLASSPATH:$jar
	fi
done

export CLASSPATH=$CLASSPATH
echo "java ${main_class} \"$@\""

4.右键工程-Debug As-maven assembly:assembly

输出日志如下图则打包成功。

四.测试

1.解压zip文件,文件夹结构如下,所有文件均存在:

2.进入bin,运行start.bat(运行环境需要安装jre环境)

3.结果如下:

在e盘的logs文件夹下

 log.log内容如下:

error.log内容如下

 因此,conf的log4j.properties正确被读取了。

 五.将log4j的日志位置设为动态,即打包后的文件夹里的logs文件夹

1.将log4j.properties改为一下内容,(将日志位置用${log4j.home}代替)

 ### \u8BBE\u7F6E###
log4j.rootLogger = debug,stdout,D,E

### 设置 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 设置debug级别以上的日志到logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${log4j.home}/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 设置error级别以上的日志到logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =${log4j.home}/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

2.主类不再是LogTest.java ,新建一个类LogTestMain.java,内容如下:

package com.zhuzhixi.zhuzhixiDataMaker.Test;

import org.apache.log4j.Logger;

public class LogTestMain {

 
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String binPath=System.getProperty("user.dir") ;
		System.out.println(binPath+"\\..\\logs");
		System.setProperty("log4j.home", binPath+"\\..\\logs");
		String log4jHome=System.getProperty("log4j.home");
		System.out.println(log4jHome);

		new LogTest().testLog();
	}

}

 2.将LogTest.java的内容改成下面:

package com.zhuzhixi.zhuzhixiDataMaker.Test;

import org.apache.log4j.Logger;


public class LogTest {
	private static Logger logger = Logger.getLogger(LogTest.class); 
	
	public void testLog(){
		  // 记录debug级别的信息  
      logger.debug("This is debug message.");  
      // 记录info级别的信息  
      logger.info("This is info message.");  
      // 记录error级别的信息  
      logger.error("This is error message."); 
	}
}

 3.然后更改start.bat的main_class为com.zhuzhixi.zhuzhixiDataMaker.Test.LogTestMain

@echo off


SET base=%~dp0
SET main_class="com.zhuzhixi.zhuzhixiDataMaker.Test.LogTestMain"
SET conf=%base%..\conf
SET libs=%base%..\lib
SET class_path=%conf%;%libs%\*;
java -classpath %class_path% %main_class%
@pause

 4.此时再打包后运行start.bat,日志文件就会在打包后的logs文件夹里了。

注意:一定要在执行Logger.getLogger(LogTestMain.class);之前执行System.getProperty("log4j.home");,所以主类不能使用log打印日志