研發管理篇:項目依賴包不能打入項目jar 引發的思考

近來在做高校雲平臺,存在着對待開發環境的學習不夠,更確切的說,是知道的不夠,導致開發效率低下的問題。

先說說現有的做法:

maven項目開發中,pom類型如果是war的話,打包時就能自動將項目依賴的jar包打到web-inf下的lib文件夾中。

但是,如果pom類型爲jar的話,打包過程中不會將依賴的包提取出來。

 

我們的做法是,在pom文件中引入jar包時,scope定義成provided;將其依賴的包放在jbossdeploy 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就可以做到了。

 


這個改進開發環境的方法並不難,或者說很簡單,但是我們卻不知道這種解決方法的存在。

可見在軟件行業百家爭鳴的時代,我們會很多技術當然很好,但更重要的是,我們需要開拓眼界,不怕不深入瞭解,就怕不知道還有很多解決方法的存在,而多看別人的博客就能打開通向世界的窗戶,快速增加我們的知道。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章