maven 打包可執行jar包的坑
寫作背景:首先是從20天的年假回來,新年的第一個任務是將使用者行為系統自動化。需要將Java專案打包成一個可執行的jar包,讓shell指令碼定時執行。
我一直習慣於用maven的maven install打包,在打包之前maven clean清理。於是,myeclipse的java project右鍵,點選 run as,在選擇maven clean,再maven install,就打包出一個可執行jar,於是興高采烈地執行,java -cp xxx.jar com…Main, 出錯了:
可是我在myeclipse中直接執行時沒錯的:
查了一下發現是包沒引入,hadoop-mapreduce-client-jobclient,hadoop-mapreduce-client-common,可是,maven裡面明明包含有這兩個包。於是我在專案新建了一個lib資料夾,將兩個jar包拷進去,加到classpath,再次執行,就沒問題了,可是,碰巧這個類只需要這兩個包,有的類是包含spring,依賴很多包的,導包的方式不可取。折騰了一下,終於知道,maven在打包是是不會將依賴包打包進去的,於是,我需要將依賴包打包在一個lib資料夾,用一下的maven外掛:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id >
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration >
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com...Main/預設主類</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
接下來執行,打包出新的jar包和一個lib資料夾,於是,再次執行,還是報錯。。。報找不到log4j,於是,點選project,clean一下專案,再次maven install,再次執行,還是報錯,跟上面的一樣。我在網上折騰了好久,終於知道,是執行jar的語句寫錯了,引進lib的jar包需要明確指定.將命令列改為:
java -cp .:./opt/lib/:/opt/mytest-1.0.jar com...Main
執行,可以了。然後打包到伺服器,伺服器只有1G記憶體,一執行,又出錯了,這個錯誤很經典:
java.lang.Exception: java.lang.OutOfMemoryError: Java heap space
相必是伺服器的記憶體不夠,要指定一下,於是將命令列修改為:
java -Xmn128M -Xms512M -Xmx512M -cp .:./opt/lib/:/opt/mytest-1.0.jar com...Main
執行後,沒報錯