Java开发小技巧(三):Maven多工程依赖项目

前言
project-monitor

下面以多可执行Jar包项目的开发为例,进行Maven多工程依赖项目开发的讲解。

需求分析

首先来看一下封面图,我们要实现的效果是:

1.多个项目共享一个项目的类和方法等通用内容

2.每个子项目单独导入所需依赖,以及各自填充父项目配置文件中的占位符

3.子项目按指定目录结构进行打包

4.所有子项目集成打包到一个统一的目录,共享依赖包和配置文件等内容

5.打包后目录结构:

  • bin:存放脚本文件,用来设置环境变量,执行相应的jar包
  • lib:依赖、项目jar包
  • etc:配置文件
  • ......

好啦,目标明确的,接下来要进行具体开发实现了

实现

打包配置

project-onepom.xml
<dependency>
<groupId>com.demo</groupId>
<artifactId>project-monitor</artifactId>
<version>0.0.1</version>
</dependency>
maven-assembly-plugin
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
package.xml
<assembly xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/assembly-1.0.0.xsd">
<id>package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory> <fileSets>
<fileSet>
<directory>src/main/resources</directory>
<includes>
<include>*.properties</include>
<include>*.xml</include>
</includes>
<outputDirectory>etc</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>

以上就实现了项目打包的配置工作,实现流程图中最后的项目结构,打包结果为zip文件

填充配置文件占位符

jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localdb:3306/test?characterEncoding=utf8&useSSL=true&serverTimezone=UTC
jdbc.username=root
jdbc.password=5EF28C5A9A0CE86C2D231A526ED5B388
PropertyPlaceholderConfigurer
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.properties</value>
</property>
<property name="ignoreResourceNotFound" value="false"/>
</bean>

Bingo,占位符修改完毕,别忘了引入父项目的上下文,毕竟我们要填充占位符的bean是在父项目中的:

<import resource="classpath*:project-monitor.xml"/>

测试Demo

DemoService
package com.demo.project.one.service;
import org.apache.log4j.Logger;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class DemoService {
private static final Logger logger = Logger.getLogger(DemoService.class);
private DataSource dataSource; public void queryDb(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null; try {
conn = dataSource.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from movie limit 1");
while(rs.next()){
logger.info(String.format("Movie[Id=%d,Title=%s,Director=%s,Genre=%s,Language=%s]",
rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
rs.getString(5)
));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
} public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}

在上下文中为其注入dataSource定义:

<bean id="demoService" class="com.demo.project.one.service.DemoService">
<property name="dataSource" ref="dataSource"/>
</bean>
log4j.propertiesDemoService
package com.demo.project.one;
import com.demo.project.one.service.DemoService;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Application {
public static void main(String[] args){
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("/project-one.xml");
DemoService demoService = (DemoService)context.getBean("demoService");
demoService.queryDb();
}
}

最终的项目结构如图

打包

一切准备就绪,轮到项目打包了,在项目根目录执行以下Maven命令即可

mvn clean package
target

执行文件

binsetenv.batproject-one.batclasspath

setenv.bat

@echo off
set SRC_DIR=%cd% cd %~dp0
cd ..
set MAIN_HOME=%cd% cd %SRC_DIR% set BIN_HOME=%MAIN_HOME%\bin
set ETC_HOME=%MAIN_HOME%\etc
set LIB_HOME=%MAIN_HOME%\lib
set CLASSPATH=%ETC_HOME%;%JAVA_HOME%\lib\tools.jar for %%i in (%LIB_HOME%\*.jar) do set CLASSPATH=!CLASSPATH!;%%i

project-one.bat

@echo off
@setlocal enableextensions enabledelayedexpansion
call setenv.bat chcp 65001
java -cp %CLASSPATH% com.demo.project.one.Application
pause
CLASSPATHproject-one-0.0.1.jar

运行

project-one.bat
结语
bin

文章项目源码已发布到Github:https://github.com/ZKHDEV/MultDependPjo