1. 程式人生 > >maven 打包可執行jar包的坑

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

執行後,沒報錯