1 需求
用戶管理模塊需要獨立提供給不同的應用使用,因為每個應用並不需要關心用戶管理的
內部細節,考慮通過LIB(java中是jar包)的方式提供,需要滿足:
- 用戶管理模塊可以獨立輸出為jar包:com.dtdream.user.x.y.jar
- 使用用戶管理的模塊導入jar包后,可以調用該jar包中提供的接口
- 使用了該jar包的應用可以在tomcat中正常部署使用
- 在idea工具中完成上述的操作。
2 生成Jar包
因為我們的jar包只是提供基礎的功能接口,所以並不需要main.class用來在加載的時候執行。下面分步驟來詳述該過程:
Step1: 找到要打包的文件
這里target目錄下的com.dtdream.user的文件都是我們要打包的文件。
注意:這里要使用target目錄下的class文件,不能用src目錄下的java文件,因為java是源文件,class文件才是java文件編譯后生成的字節碼文件,只有這樣的文件提供的接口才能被其他外部應用引用。
Step2: 指定打包配置:
點擊右邊第二個圖標:
在出現的窗口中配置Artifacts:
點擊+,選擇jar包,就可以出現一個類似上面的窗口。
- 在Name中配置jar包的名稱
- 選中Build on make
- 配置Output directory,后續生成的jar包就放在這個目錄中了
- 點擊Output Layout下的+, 選擇要打包的文件,這里可以選擇剛剛的class目錄,注意如果后續模塊要通過import com.dtdream.user.xxx來使用該jar包的接口,則這里就應該選擇com的上一層目錄class
- 點擊Output Layout下的+,選擇一個META-INF文件,或者直接用工程中的該文件,這個是打包必須的,用處未知。
完成上面步驟之后,點擊Apply->OK,這樣就配置好了。
Step3: 生成JAR包:
點擊idea上邊欄中的build->make project即可生成jar包
生成的jar包如下,可以用WinRAR打開看一下:
3 使用JAR包
Step1:導入JAR包:
在IDEA中找到剛才配置Artifacts的界面,點到Libraries邊欄,點擊+號,添加剛才生成
的JAR包,這里可以把JAR包拷貝到當前工程的lib目錄,或者放在任何適合的目錄,並不影響使用。
Step2:在工程中使用JAR包提供的接口:
從上圖可以看出,當前的工程師com.dtdream.cloud,在該工程中的controller目錄下的一個文件中,通過import關鍵字導入了com.dtdream.user的JAR包中實現的類,后續就可以正常調用類中的方法了。
Step3:將JAR包導入到發布包中:
完成了上述步驟之后,可以正常的編譯了。但是如果要是想將生成用於發布的war包還差一步,因為此時war包並不知道它要把com.dtdream.user包含進去。按照下面的方法配置:
還是這個界面,在war包右面的窗口中添加lib,將com.dtdream.user的lib添加到manage.war中,后續發布manage.war的時候就可以包含user的jar包了。
可以看到我們當時生成user的jar包的時候也是一個Artifact,所以如果我們的user的jar包如果對某些lib有強依賴的時候,也可以通過這里來添加自己依賴的lib。或者通過pom.xml來指定依賴也可以。
4 注意事項
4.1 Service注入的問題
如上圖,如果通過@Resource來使用com.dtdream.user提供的各種Service,包括
roleService, privilegeService, userService,DepartmentService。如果不做任何修改,會出錯,因為在mvc-disptch-servelet.xml中配置的是只掃描com.dtdream.cloud目錄下bean:
為了可以在任 何地方都使用User中提供的Service,新增了一個spring-context.xml文件,在其中定義如下bean,直接指定service:
<bean id="usersDao" class="com.dtdream.user.dao.impl.UserDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="departmentDao" class="com.dtdream.user.dao.impl.DepartmentDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="roleDao" class="com.dtdream.user.dao.impl.RoleDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="privilegeDao" class="com.dtdream.user.dao.impl.PrivilegeDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="userService" class="com.dtdream.user.service.impl.UserService"> <property name="dao" ref="usersDao"></property> </bean> <bean id="DepartmentService" class="com.dtdream.user.service.impl.DepartmentService"> <property name="dao" ref="departmentDao"></property> </bean> <bean id="roleService" class="com.dtdream.user.service.impl.RoleService"> <property name="dao" ref="roleDao"></property> </bean> <bean id="privilegeService" class="com.dtdream.user.service.impl.PrivilegeService"> <property name="dao" ref="privilegeDao"></property> </bean>
4.2 數據庫配置文件的修改問題
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <!-- 可以加多個包 --> <value>com.dtdream.cloud.entity</value> <value>com.dtdream.cloud.openstack.entity</value> <value>com.dtdream.user.entity</value> </list> </property> </bean>
在上面加上com.dtdream.user.entity.
5 完
至此,可以在IDEA中正常導出和導入JAR包了,已經在環境中實測過可以使用。