关于maven打包

267 阅读2分钟

背景

最近需要将一个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包的时候传入文件路径就行了!需要什么就传什么