zoukankan      html  css  js  c++  java
  • 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应用。

  • 相关阅读:
    uva11059
    uva725
    程序中double类型的数输出为什么要用lf
    c++形参和实参同名时,如何单步执行观察形参的变化。
    台式机的字母键和数字键都不能正常使用了呢?
    找错误——下面的程序意图在于统计字符串中字符数1的个数,可惜有瑕疵
    初学者常见错误1——赋值时的类型转换
    scanf
    c++的调试与运行
    黑猫派对
  • 原文地址:https://www.cnblogs.com/ZeroMZ/p/11284086.html
Copyright © 2011-2022 走看看