Ant-编译构建(2)-第3方jar包引入、log4j2

1、项目目录结构图,lib包引入了一些关于common logging+log4j2相关的jar。

2、编写相关的build.xml

<?xml version="1.0" encoding="utf-8"?>
<!--定义生成文件的project根元素,默认的target为空-->
<project name="log4j2Test" basedir="." default="all">
   <target name="all" depends="help,init,compile,build,run,clean">
      <echo>Finish!</echo>
   </target>
   
   <!--定义4个简单属性-->
   <property name="src" value="src"/>
   <property name="classes" value="classes"/>
   <property name="lib" value="lib"/>
   <property name="dest" value="dest"/>
   <property name="log" value="log"/>
   
   <!--定义help target,用于输出该生成文件的帮助信息-->
   <target name="help" description="打印帮助信息">
      <echo>help - 打印帮助信息</echo>
      <echo>complie - 编译Java源文件</echo>
      <echo>run - 运行程序</echo>
      <echo>build - 打包Jar包</echo>
      <echo>clean - 清除所有编译生成的文件</echo>
   </target>
   
   <!--init target,初始化-->
   <target name="init">
      <delete dir="${classes}"/>
      <mkdir dir="${classes}"/>
      <delete dir="${dest}"/>
      <mkdir dir="${dest}"/>
      <delete dir="${log}"/>
      <mkdir dir="${log}"/>
   </target>
   
   <!--定义一组文件路径集-->
   <path id="classpath">
      <fileset dir="${lib}">
        <include name="**/*.jar"/>
      </fileset>
      <pathelement path="${classes}"/>
   </path>
   
   <!--定义complie target,用于编译Java源文件-->
   <target name="compile" description="编译java源文件">
      <!--编译java文件,编译后的class文件放到classes属性所代表的文件夹内-->
      <javac destdir="${classes}" includeantruntime="yes" encoding="utf-8">
          <!--指定需要编译的Java文件所在的位置-->
          <src path="${src}"/>
          <!--指定编译Java文件所需要的第三方类库所在的位置-->
          <classpath refid="classpath"/>
      </javac>
   </target>
   
   <!--定义build target,用于打包jar文件,运行该target之前会先运行compile target-->
   <target name="build" description="打包jar文件" depends="compile">
      <!--将项目中除编译生成class文件的java文件之外的其他类型文件拷贝到对应的文件夹-->
      <copy todir="${classes}">
          <fileset dir=".">
            <include name="log4j2.xml"/>
            <include name="说明.txt"/>
          </fileset>
      </copy>
      <!--指定将classes属性所代表的文件夹下的所有*.class文件都打包到app.jar文件中-->
      <jar destfile="${dest}/app-1.0.2.jar" basedir="${classes}" includes="**/*.class **/*.xml **/*.txt">
         <!--为jar包的清单文件添加属性-->
         <manifest>
            <attribute name="Main-Class" value="src.com.lfy.Student"/>
         </manifest>
         <!--将相关被引用的包以解压后的方式打包进jar包中-->
         <zipfileset src="${lib}/commons-logging-1.2.jar"></zipfileset>
         <zipfileset src="${lib}/log4j-jcl-2.12.0.jar"></zipfileset>
         <zipfileset src="${lib}/log4j-core-2.12.0.jar"></zipfileset>
         <zipfileset src="${lib}/log4j-api-2.12.0.jar"></zipfileset>
      </jar>
      <!--打包第3方jar通过引用的方式运行的可执行jar-->
      <jar destfile="${dest}/app-1.0.3.jar" basedir="${classes}" includes="**/*.class **/*.xml **/*.txt">
         <!--为jar包的清单文件添加属性-->
         <manifest>
            <attribute name="Main-Class" value="src.com.lfy.Student"/>
         </manifest>
         <!--将相关被引用的包以解压后的方式打包进jar包中-->
         <zipfileset src="${lib}/commons-logging-1.2.jar"></zipfileset>
         <zipfileset src="${lib}/log4j-jcl-2.12.0.jar"></zipfileset>
         <zipfileset src="${lib}/log4j-core-2.12.0.jar"></zipfileset>
         <zipfileset src="${lib}/log4j-api-2.12.0.jar"></zipfileset>
      </jar>
   </target>
   
   <!--定义run target,用于运行Java源文件,运行该target之前会先运行compile target-->
   <target name="run" description="运行程序" depends="compile">
      <!--运行lfy.HelloWorld类,其中fork指定启动另一个JVM来执行Java命令-->
      <java classname="src.com.lfy.Student" fork="yes" failonerror="true">
          <classpath refid="classpath"/>
          <!--运行Java程序时传入2个参数-->
          <arg line="测试参数1 测试参数2"/>
      </java>
      <!--运行可执行jar文件-->
      <java jar="${dest}/app-1.0.2.jar" fork="yes" failonerror="true">
          <!--运行Java程序时传入2个参数-->
          <arg line="p1 p2"/>
      </java>
      <java jar="${dest}/app-1.0.3.jar" fork="yes" failonerror="true">
          <!--运行Java程序时传入2个参数-->
          <arg line="p1 p2"/>
      </java>
   </target>
   
   <!--定义clean target,用于删除所有编译生成的文件-->
   <target name="clean" description="清除所有编译生成的文件">
      <delete dir="${classes}"/>
      <delete dir="${dest}"/>
      <delete dir="${log}"/>
   </target>
   
</project>

3、编写log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <!-- 定义日志格式 -->
        <Property name="log.pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
        <!-- 定义文件名变量 -->
        <Property name="file.all.filename">log/all.log</Property>
        <Property name="file.all.pattern">log/all.%i.log.gz</Property>
        <Property name="file.err.filename">log/err.log</Property>
        <Property name="file.err.pattern">log/err.%i.log.gz</Property>
    </Properties>
    <!-- 定义Appender,即目的地 -->
    <Appenders>
       <!-- 定义输出到控制台 -->
       <Console name="console" target="SYSTEM_OUT">
           <!-- 日志格式引用上面定义的log.pattern -->
           <PatternLayout pattern="${log.pattern}"/>
       </Console>
       <!-- 定义输出到文件,文件名引用上面定义的file.all.file.filename -->
       <RollingFile name="all" bufferedIO="true" fileName="${file.all.filename}" filePattern="${file.all.pattern}">
           <PatternLayout pattern="${log.pattern}"/>
           <Policies>
               <!-- 根据文件大小自动切割日志 -->
               <SizeBasedTriggeringPolicy size="10 KB" />
           </Policies>
           <!-- 保留最近5份 -->
           <DefaultRolloverStrategy max="5" />
       </RollingFile>
       <!-- 定义输出到文件,文件名引用上面定义的file.err.file.filename -->
       <RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
           <PatternLayout pattern="${log.pattern}"/>
           <Policies>
               <!-- 根据文件大小自动切割日志 -->
               <SizeBasedTriggeringPolicy size="2 KB" />
           </Policies>
           <!-- 保留最近5份 -->
           <DefaultRolloverStrategy max="5" />
       </RollingFile>
    </Appenders>
    <Loggers>
       <Root level="info">
           <!-- 对info级别的日志,输出到console -->
           <AppenderRef ref="console" level="info"/>
           <!-- 对info级别的日志,输出到all,即上面定义的RollingFile -->
           <AppenderRef ref="all" level="info"/>
           <!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
           <AppenderRef ref="err" level="error"/>
       </Root>
    </Loggers>
</Configuration>

4、编写Person.java、Student.java

   Person.java

package src.com.lfy;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Person{
    /**
     * 使用LogFactory.getLog(getClass()),也可以使用LogFactory.getLog(Person.class)
     * 前者可以使子类的实例直接使用log,看Student.java中的代码
    */
    protected final Log log=LogFactory.getLog(getClass());
    void foo(){
        log.info("Person.foo()");
    }
}

  Student.java

package src.com.lfy;

public class Student extends Person{
   void bar(){
          log.info("Student.bar()");
       try{
           int a=5,b=1;
           b=a/0;
       }catch(Exception e){
           //捕获异常非常简单
           log.error("got exception",e);
       }
   }
   public static void main(String[] agrs){
       Student stu=new Student();
       stu.bar();
   }
}

5、运行结果

 

6、总结:实现了简单的log4j应用。

posted @ 2019-08-01 17:51  ZeroMZ  阅读(456)  评论(0编辑  收藏  举报