Maven运行Main方法
在Maven使用入门(二)提供了生成含有MainClass类信息的Jar包的方法,用户也可以在项目目录下直接运行main方法(JAR包中不包含MainClass信息) 。
Maven Exec插件,Exec插件允许你运行Java类和其它脚本。它不是Maven核心插件,但它可以从Codehaus的Mojo项目得到。想要查看Exec插件的完整描述,运行 mvn help:describe -Dplugin=exec -Dfull.这会列出所有 Maven Exec 插件可用的目标。 Help 插件同时也会列出 Exec 插件的有效参数,如果你想要定制 Exec 插件的行为,传入命令行参数,你应该使用help:describe 提供的文档作为指南。 虽然 Exec 插件很有用,在开发过程中用来运行测试之外,你不应该依赖它来运行你的应用程序。 想要更健壮的解决方案,使用Maven Assembly 插件.
执行命令如下:
mvn install
mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main
Exec 插件让我们能够在不往 classpath 载入适当的依赖的情况下,运行这个程序。 在任何其它的构建系统能够中,我们必须复制所有程序依赖到类似于 lib/ 的目录,这个目录包含一个 JAR 文件的集合。 那样,我们就必须写一个简单的脚本,在classpath 中包含我们程序的二进制代码和我们的依赖。 只有那样我们才能运行 java
org.sonatype.mavenbook.weather.Main 。 Exec 能做这样的工作是因为 Maven 已经知道如何创建和管理你的 classpath 和你的依赖。
构建一个打包好的命令行应用程序(依赖打进去)
虽然 Maven Exec 能运行程序并且产生输出,你不能就把 Maven当成是你程序运行的容器。 如果你把这个命令行程序分发给其他人,你大概就需要分发一个 JAR 或者一个 ZIP 存档文件或者 TAR 压缩过的 GZIP 文件。下面介绍了使用 Maven Assembly 插件的预定义装配描述符生成一个可分发的 JAR 文件的过程,该文件包含了项目的二进制文件和所有的依赖。Maven Assembly 插件是一个用来创建你应用程序特有分发包的插件。 你可以使用 Maven Assembly 插件以你希望的任何形式来装配输出,只需定义一个自定义的装配描述符。 后面的章节我们会说明如何创建一个自定义装配描述符,为 SimpleWeather 应用程序生成一个更复杂的存档文件。 本章我们将会使用预定义的 jarwith-dependencies 格式。 要配置 Maven Assembly 插件, 我们需要在 pom.xml 中的build 配置中添加如下的 plugin 配置。
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
添加好这些配置以后,你可以通过运行 mvn assembly:assembly 来构建这个装配。mvn install assembly:assembly
在 target/simple-weather-1.0-jar-with-dependencies.jar 装配好之后, 我们可以在命令行重新运行 Main 类。在你项目的基础目录下运行以下命令:
java -cp simple-weather-1.0-jar-with-dependencies.jar org.sonatype.mavenbook.weather
jar-with-dependencies 格式创建一个包含所有 simple-weather 项目的二进制代码以及所有依赖解压出来的二进制代码的 JAR 文件。
查看依赖
dependency:resolve(Dependency 插件将会打印出最终的你项目编译所基于的所有依赖的组合)
mvn dependency:tree(依赖层次树)
mvn install -X 如果你还不满足,或者想要查看完整的依赖踪迹,包含那些因为冲突或者其它原因而被拒绝引入的构件,打开 Maven 的调试标记运行,从调试输出我们看到一些依赖管理系统工作的内部信息。从该输出你能看到 Maven 正在创建一个依赖图,排除重复,解决不同版本之间的冲突。 如果你的依赖有问题,通常在dependency:tree 所生成的列表基础上更深入一点会有帮助;开启调试输出允许你看到Maven 工作时的依赖机制。