背景
最近需要将一个maven的项目打包然后放到服务器上,以往的Spring项目都是打包成war包然后丢到tomcat中,但是这次不一样,这次是一个普通的Java程序,而不是一个web项目
过程
如果直接使用maven的package指令将程序打包成一个jar包,然后使用java -jar运行的时候,会报错,原因是找不到main程序的入口,其实是这个也很符合逻辑,项目中可能有多个main方法,那你java -jar就这么想让我运行,我也不知道去跑哪一个啊,你得指定一下啊!
所以这里就出现了第一个问题,怎么指定main方法的入口?
在maven的配置文件pom.xml中,添加一段代码:
<build>
<finalName>fileReadier</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>这里指定主方法的入口类</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
添加了上面的代码之后,再使用package打包然后使用java -jar指令运行,会发现能够运行但是程序中使用到的相关的依赖找不到
这是因为我们添加了这个插件之后打包只是将原程序打包,但是没有将依赖一起打包进去,所有它自然找不到依赖文件在哪里,又不能去maven仓库中找
所以这里出现了第二个问题:怎么把依赖也一起打包进去,成一个完成的可独立执行jar程序?
起始方法很简单,只需要将上面的代码改成
<build>
<finalName>fileReadier</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<!-- 这里修改成maven-shade插件就好了 -->
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>这里指定主方法的入口类</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
maven-shade插件能够将依赖一起打包
然后再重复上面的打包--运行步骤,你会发现,我么的目标实现了!
看来maven中的打包方面的只是还不少,有空得回去复习、深入一下!
后续问题
由于我这个程序是要处理一个文件,那文件我不能写死啊,我得自己指定一个文件名传过去啊!
这个其实很简单,我们的main方法上面可是带参数的,java -jar xxx.jar "hello" "world"这样的指令中,就会将"hello"和"world"这两个字符串传到args中,所以说,只需要稍微修改代码(怎么修改就不用说了吧),然后执行jar包的时候传入文件路径就行了!需要什么就传什么