使用Spring跟踪应用异常(6)—构建一个可运行JAR包

如果你已经读过本系列的前五篇博文,那么你就已经知道我正在做一个这样的项目:用Spring框架去开发一个周期检测异常,输出错误日志然后发送邮件通知结果。

目前代码已经编写完毕并测试完成。下一步也就是最后一步,就是去打包整个项目然后部署到生产服务器上去。实际部署和打包的方式取决于你自己组织的工作流程。在这个例子中,我讲采用可能是最简单的方法创建和打包一个可运行JAR文件。第一步好几周之前已经完成了,那就是在Maven POM文件里定义输出JAR文件。你可能已经知道,实现的方式就是使用packaging标签元素:

    <packaging>jar</packaging>

JAR文件已经有了,但是还有一步需要做:使这个文件可以运行。为了使一个JAR文件可以运行,你需要添加一个MANIFEST.MF文件,然后把他放在META-INF目录下。这个manifest 文件作用是描述JAR文件的信息给JVM虚拟机和开发者查看。

像往常一样,做这件事有好几种方法。如果你想给自己制造一些困难,可以完全手工创建文件然后放在项目src/main/resources目录下META-INF文件夹里面。另一种方法,你可以使用maven-jar plug-in。插件可以帮你自动完成这些事情。为了使用这个插件,你需要在POM文件里面添加这些信息:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass>com.captaindebug.errortrack.Main</mainClass>
                    <classpathPrefix>lib/</classpathPrefix>
            </manifest>
        </archive>
        </configuration>
    </plugin>

在这里,<archive><manifest> 配置元素标签很有意思。它包含三个子元素标签:

  1. addClasspath:这意味着插件会添加classpath到MANIFEST.MF文件,好让JVM在运行的时候可以找到所有依赖的jar包。
  2. mainClass:这个告诉插件去添加Main-Class属性到MANIFEST.MF文件中,好让JVM知道在哪里去找到项目的运行入口。在这个例子中它是com.captaindebug.errortrack.Main。
  3. classpathPrefix:这个标签真的非常有用。它允许你把倚赖JAR包放在一个相对于项目主要部分不同的地方。在这个例子中,我选择了一个非常简单而且短的名字lib。

如果你构建了这个项目,然后打开构建后的JAR文件并且解压它,检查一下META-INF/MANIFEST.MF文件,你会发现一些像这样的东西:

    Manifest-Version: 1.0
    Built-By: Roger
    Build-Jdk: 1.7.0_09
    Class-Path: lib/spring-context-3.2.7.RELEASE.jar lib/spring-aop-3.2.7.RELEASE.jar lib/aopalliance-1.0.jar lib/spring-beans-3.2.7.RELEASE.jar lib/spring-core-3.2.7.RELEASE.jar lib/spring-expression-3.2.7.RELEASE.jar lib/slf4j-api-1.6.6.jar lib/slf4j-log4j12-1.6.6.jar lib/log4j-1.2.16.jar lib/guava-13.0.1.jar lib/commons-lang3-3.1.jar lib/commons-logging-1.1.3.jar lib/spring-context-support-3.2.7.RELEASE.jar lib/spring-tx-3.2.7.RELEASE.jar lib/quartz-1.8.6.jar lib/mail-1.4.jar lib/activation-1.1.jar
    Created-By: Apache Maven 3.0.4
    Main-Class: com.captaindebug.errortrack.Main
    Archiver-Version: Plexus Archiver

最后一步,将所有的倚赖JAR包放入到一个目录中,在这个例子中就是lib文件夹。这样JVM在运行项目的时候才能找到他们。当然,有两种方式实现这个功能:一种比较简单,另一种相对复杂。复杂的方法是手工按照POM文件里面定义的JAR包顺序依次将他们收集齐(包括直接和间接依赖的JAR包),然后复制到输出目录。简单的方法是使用maven-dependency-plugin插件。这个需要你添加下面的信息到POM文件中:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.5.1</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>
                        ${project.build.directory}/lib/
                    </outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

在这个例子中,使用了复制倚赖目标的功能去复制所有的项目倚赖包到${project.build.directory}/lib/目录下。注意这个路径名lib,要和在上一步配置的classpathPrefix标签内容保持一致。

为了更加简单的实现这个功能,我还创建了一个小的脚本runme.sh:

    #!/bin/bash        

    echo Running Error Tracking...
    java -jar error-track-1.0-SNAPSHOT.jar com.captaindebug.errortrack.Main

这就是所有内容,项目基本上完成了。我已经复制它到我的构建服务器,在那里这个程序正在监控Captain Debug Github的示例程序。

我以后可能会添加更多的功能到这个项目中。还有很多不足之处需要修改一下代码:例如作为一个独立APP运行这种方式好吗?把他变成一个Web程序运行是不是更好呢?更进一步,确保同样的错误不会报告两次会不会是一个更好的想法呢?

我可能会很快的去实现这些功能或者可能我会谈论一些其他的东西,时间太少而要写的内容太多……

这个博文的代码已经放在了Github上了:https://github.com/roghughe/captaindebug/tree/master/error-track

原文链接: dzone 翻译: ImportNew.com - 陈 显鹭
译文链接: http://www.importnew.com/11886.html
[ 转载请保留原文出处、译者和译文链接。]

关于作者: 陈 显鹭

(新浪微博:@bird1992),(博客:技术是我的毕生追求

查看陈 显鹭的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部