如果您阅读了本系列的前五个博客,您会知道我一直在构建一个Spring应用程序,该应用程序定期运行以检查一大堆错误日志中是否存在异常,然后将结果通过电子邮件发送给您。
编写了代码和测试,并确定下一步和最后一步将工作是将整个程序打包并将其部署到生产机器上。 实际的部署和打包方法将取决于您自己组织的过程和程序。 但是,在此示例中,我将选择创建和部署可执行JAR文件的最简单方法。 第一步是在几周前完成的,它将我们的输出定义为Maven POM文件中的JAR文件,您可能已经知道,它是使用包装元素完成的:
<packaging>jar</packaging>
可以使用JAR文件,但是在这种情况下,还需要执行进一步的步骤:使其可执行。 为了使JAR文件可执行,您需要添加MANIFEST.MF
文件并将其放置在名为META-INF
的目录中。 清单文件是一个向JVM和人类读者描述JAR文件的文件。
和往常一样,有两种方法可以做到这一点,例如,如果您想让自己的生活变得困难,则可以手工制作自己的文件并将其放在项目src / main / resources中的META-INF
目录中目录。 另一方面,您可以使用maven-jar
插件并自动执行。 为此,您需要将以下内容添加到您的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
:这意味着该插件会将类路径添加到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文件手动收集在一起(直接和暂时依赖性),然后将它们复制到输出目录。 最简单的方法包括让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>
在这种情况下,您将使用在软件包阶段执行的copy-dependencies
目标将所有项目依赖项复制到${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示例应用程序和构建。
我可以并且确实可以为该应用程序添加更多功能。 有一些需要改进的代码:例如,最好将其作为单独的应用程序运行,还是将其转变为Web应用程序更好? 此外,确保不两次报告相同的错误不是一个好主意吗?
我可能很快就会流连忘返……或者也许我会谈论其他事情。 这么少的时间就写很多博客…
该博客的代码可在Github上找到: https : //github.com/roghughe/captaindebug/tree/master/error-track 。 如果您想查看本系列中的其他博客,请在这里看……
- 使用Spring跟踪应用程序异常
- 使用Spring跟踪异常–第2部分–委托模式
- 错误跟踪报告–第3部分–策略和软件包私有
- 跟踪异常–第4部分– Spring的邮件发件人
- 跟踪异常–第5部分–使用Spring进行计划
翻译自: https://www.javacodegeeks.com/2014/05/tracking-exceptions-part-6-building-an-executable-jar.html