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包了,已经在环境中实测过可以使用。