简易顺序执行框架attic开发笔记2


上篇

空格的处理

本来想自己写词法分析的,结果自己编译原理基础不牢固写出来老是死循环,所以使用opencsv。核心代码如下:

CSVReader csvReader = new CSVReader(reader, ' ');
String[] fields = null;
while ((fields = csvReader.readNext()) != null) {
  // do stuff with fields
}
csvReader.close();

这里使用空格代替CSV默认的分割符号冒号。

打包

本来以为打包很简单,因为单个模块时mvn dependency:copy-dependencies也能把所有依赖导出来,自己写个简单的shell还是works的。但是现在是多模块,总感觉不方便。后来知道了maven-assembly-plugin,不过这个插件的文档不是step by step的,个人感觉无从入手。不得已google了一些现有配置,大部分都是来自博客的,总算找到了能用的配置。

首先在插件配置中制定装配的XML:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.4</version>
      <executions>
        <execution>
          <id>assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <descriptors>
              <descriptor>src/main/assembly/assembly.xml</descriptor>
            </descriptors>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

接下来在src/main/assembly/assembly.xml中写如下配置:

<?version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <id>bin</id>
  <formats>
    <format>tar.gz</format>
    <format>dir</format>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>
      <binaries>
        <outputDirectory>lib</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>
  <dependencySets>
      <dependencySet>
          <useProjectArtifact>false</useProjectArtifact>
          <outputDirectory>lib</outputDirectory>
      </dependencySet>
  </dependencySets>
  <fileSets>
      <fileSet>
          <directory>src/main/scripts</directory>
          <outputDirectory>bin</outputDirectory>
          <includes>
              <include>*.sh</include>
              <include>*.bat</include>
          </includes>
      </fileSet>
  </fileSets>
</assembly>

最终得到一个含有bin和lib目录的分发包/目录,lib中是项目所有模块的依赖以及项目自身模块的包,bin目录下是src/main/scripts复制过来的脚本文件。

日志配置

本来不想处理的,但是某些命令实现的依赖中存在日志代码,不得不考虑配置。因为大部分日志都是通过commons-logging处理的,按照现在Java程序的处理方式,建议通过重定向方式由log4j实现和配置。在pom.xml中加入如下依赖:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.14</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.5.2</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.5.2</version>
  <scope>runtime</scope>
</dependency>

增加log4j.properties

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p %m%n

log4j.logger.org.apache.commons.httpclient=ERROR

以上配置提升httpclient的日志阈值到ERROR,这样就不会看到WARN级别的cookie日志了。