近來在做高校雲平臺,存在着對待開發環境的學習不夠,更確切的說,是知道的不夠,導致開發效率低下的問題。
先說說現有的做法:
maven項目開發中,pom類型如果是war的話,打包時就能自動將項目依賴的jar包打到web-inf下的lib文件夾中。
但是,如果pom類型爲jar的話,打包過程中不會將依賴的包提取出來。
我們的做法是,在pom文件中引入jar包時,scope定義成provided;將其依賴的包放在jboss的deploy lib目錄下,每次啓動jboss時加載。
這樣做存在的問題:
需要將pom類型改成war,然後執行一下package命令,這樣先把所以依賴到的包提取出來,然後放入jboss lib下。然後再把pom類型改成jar,這樣雖然能完成任務,但是總感覺這樣的做法比較拙劣。
ejb項目依賴的jar包需要和jboos lib下的jar包一致,也就是在維護兩份數據,當需要添加依賴jar包了,就得記得放入jboss lib中一份,如果忘記了,那你就慢慢調吧。
項目依賴的普通jar包,scope定義成provided,會帶來不便,比如在用jetty調試時,又需要這些jar包,又需要把jboss lib下的jar包拷回來。provided這種範圍是爲這種情形設計的——項目引用的jar包和容器衝突。而我們項目中,scope全部定義成provided。
引入maven,肯定是可以提高團隊開發效率的,而我們還在把jar包拷來拷去,也就成了爲了使用maven而去使用maven。所以這個過程展現了我們的成長過程,對maven的不斷了解和深入。
我們抱怨這樣的開發,不僅效率低,而且對耐心也是一個挑戰啊。
與其抱怨不如去改變,經常在問自己,難道別人也是這樣開發的嗎,肯定不是,否則效率太低了。
功夫不負有心人,發現通過maven的assembly插件就能解決這個問題。
通過maven的assembly插件,將項目的依賴包提取出來達成一個單獨的包,這樣依賴scope定義成compile,上面的問題也就都解決了。
實現
實現起來很簡單,在pom.xml 添加如下插件:
<plugin>
<!-- NOTE: We don't need a groupId specification because the group is
org.apache.maven.plugins ...which is assumed by default.
-->
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<!-- <descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs> -->
<descriptors>
<descriptor>src/main/assembly/src.xml</descriptor>
</descriptors>
</configuration>
</plugin>
然後執行mvnassembly:assembly,會在${project}/target 文件夾下發現新生成的 {artifactId}-jar-with-dependencies.jar
看看依賴包裏面的結構
看過之後發現不足了吧,在部署的過程中我們往往希望,將各個第三方包單獨部署,比如shiro包就歸shiro包,spring包就歸spring包,這樣便於管理你,比如日後升級就方便了,就像這樣:
來看看如何可以做到:
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
這個jar-with-dependencies是assembly預先寫好的一個,組裝描述引用(assemblydescriptor)。
這個定義這個組裝描述(assemly descriptor)的xml文件
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
</fileSet>
</fileSets>
</assembly>
其實只要將上面這個xml文件中的
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
改成:
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
然後將之前pom.xml 中的plugin改成如下:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/src.xml</descriptor>
</descriptors>
</configuration>
</plugin>
再執行mvnassembly:assembly就可以做到了。
這個改進開發環境的方法並不難,或者說很簡單,但是我們卻不知道這種解決方法的存在。
可見在軟件行業百家爭鳴的時代,我們會很多技術當然很好,但更重要的是,我們需要開拓眼界,不怕不深入瞭解,就怕不知道還有很多解決方法的存在,而多看別人的博客就能打開通向世界的窗戶,快速增加我們的知道。