使用Spring跟踪应用异常(6)—构建一个可运行JAR包,springjar
使用Spring跟踪应用异常(6)—构建一个可运行JAR包,springjar
如果你已经读过本系列的前五篇博文,那么你就已经知道我正在做一个这样的项目:用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>
配置元素标签很有意思。它包含三个子元素标签:
- addClasspath:这意味着插件会添加classpath到MANIFEST.MF文件,好让JVM在运行的时候可以找到所有依赖的jar包。
- mainClass:这个告诉插件去添加Main-Class属性到MANIFEST.MF文件中,好让JVM知道在哪里去找到项目的运行入口。在这个例子中它是com.captaindebug.errortrack.Main。
- 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 翻译: Wld5.com - 陈 显鹭译文链接: http://www.wld5.com/11886.html
[ 转载请保留原文出处、译者和译文链接。]
用户点评