1      需求

  用户管理模块需要独立提供给不同的应用使用,因为每个应用并不需要关心用户管理的

  内部细节,考虑通过LIB(java中是jar包)的方式提供,需要满足:

  • 用户管理模块可以独立输出为jar包:com.dtdream.user.x.y.jar
  • 使用用户管理的模块导入jar包后,可以调用该jar包中提供的接口
  • 使用了该jar包的应用可以在tomcat中正常部署使用
  • 在idea工具中完成上述的操作。

2      生成Jar包

  因为我们的jar包只是提供基础的功能接口,所以并不需要main.class用来在加载的时候执行。下面分步骤来详述该过程:

     Step1: 找到要打包的文件

   

idea 包 导入spark idea导入lib包_java

      这里target目录下的com.dtdream.user的文件都是我们要打包的文件。

      注意:这里要使用target目录下的class文件,不能用src目录下的java文件,因为java是源文件,class文件才是java文件编译后生成的字节码文件,只有这样的文件提供的接口才能被其他外部应用引用。

      Step2: 指定打包配置:

      点击右边第二个图标:

   

idea 包 导入spark idea导入lib包_java_02

      在出现的窗口中配置Artifacts:

   

idea 包 导入spark idea导入lib包_开发工具_03

     点击+,选择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打开看一下:

  

idea 包 导入spark idea导入lib包_开发工具_04

 

3      使用JAR包

  Step1:导入JAR包:

  在IDEA中找到刚才配置Artifacts的界面,点到Libraries边栏,点击+号,添加刚才生成

  的JAR包,这里可以把JAR包拷贝到当前工程的lib目录,或者放在任何适合的目录,并不影响使用。

   

idea 包 导入spark idea导入lib包_java_05

  Step2:在工程中使用JAR包提供的接口:

   

idea 包 导入spark idea导入lib包_数据库_06

         从上图可以看出,当前的工程师com.dtdream.cloud,在该工程中的controller目录下的一个文件中,通过import关键字导入了com.dtdream.user的JAR包中实现的类,后续就可以正常调用类中的方法了。

  Step3:将JAR包导入到发布包中:

         完成了上述步骤之后,可以正常的编译了。但是如果要是想将生成用于发布的war包还差一步,因为此时war包并不知道它要把com.dtdream.user包含进去。按照下面的方法配置:

   

idea 包 导入spark idea导入lib包_开发工具_07

         还是这个界面,在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注入的问题

   

idea 包 导入spark idea导入lib包_java_08

  如上图,如果通过@Resource来使用com.dtdream.user提供的各种Service,包括

  roleService, privilegeService, userService,DepartmentService。如果不做任何修改,会出错,因为在mvc-disptch-servelet.xml中配置的是只扫描com.dtdream.cloud目录下bean:

   

idea 包 导入spark idea导入lib包_java_09

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