前言
本篇文章基于Java開發(fā)小技巧(二):自定義Maven依賴中創(chuàng)建的父工程project-monitor
實現(xiàn)拙友,運(yùn)用我們自定義的依賴包進(jìn)行多工程依賴項目的開發(fā)。
下面以多可執(zhí)行Jar包項目的開發(fā)為例,進(jìn)行Maven多工程依賴項目開發(fā)的講解裙盾。
需求分析
首先來看一下封面圖欣孤,我們要實現(xiàn)的效果是:
1.多個項目共享一個項目的類和方法等通用內(nèi)容
2.每個子項目單獨導(dǎo)入所需依賴,以及各自填充父項目配置文件中的占位符
3.子項目按指定目錄結(jié)構(gòu)進(jìn)行打包
4.所有子項目集成打包到一個統(tǒng)一的目錄辟犀,共享依賴包和配置文件等內(nèi)容
5.打包后目錄結(jié)構(gòu):
- bin:存放腳本文件,用來設(shè)置環(huán)境變量绸硕,執(zhí)行相應(yīng)的jar包
- lib:依賴堂竟、項目jar包
- etc:配置文件
- ......
好啦,目標(biāo)明確的玻佩,接下來要進(jìn)行具體開發(fā)實現(xiàn)了
實現(xiàn)
打包配置
在上一篇文章中已經(jīng)創(chuàng)建好了一個自定義的Maven依賴出嘹,相當(dāng)于一個父項目,接下來我們新建一個子項目咬崔,命名為project-one
税稼,pom.xml
文件與父項目基本相同烦秩,所有依賴包都必須單獨引入,不同的是多了對父項目的依賴:
<dependency>
<groupId>com.demo</groupId>
<artifactId>project-monitor</artifactId>
<version>0.0.1</version>
</dependency>
以及Maven插件maven-assembly-plugin
的引入郎仆,用來實現(xiàn)依賴的打包以及打包后的目錄結(jié)構(gòu):
<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>
目錄結(jié)構(gòu)配置位于項目根目錄下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>
以上就實現(xiàn)了項目打包的配置工作只祠,實現(xiàn)流程圖中最后的項目結(jié)構(gòu),打包結(jié)果為zip文件
填充配置文件占位符
之前我們在父項目的spring上下文中定義了一個數(shù)據(jù)源bean扰肌,配置信息使用了占位符填充抛寝,所以如果我們想要使用這個bean,就需要替換其中的占位符信息曙旭,要怎么做呢盗舰?
首先當(dāng)然是創(chuàng)建配置文件了,在項目中創(chuàng)建jdbc.properties
JDBC配置文件桂躏,如:
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
這個類來實現(xiàn)钻趋,在項目spring上下文中定義bean:
<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
好了,接下來來測試項目的可行性进倍,主要實現(xiàn)使用父項目定義的數(shù)據(jù)源來對MySql進(jìn)行查詢土至。
先創(chuàng)建一個DemoService
類,內(nèi)容如下:
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.properties
配置文件猾昆,這里就不貼出文件內(nèi)容了陶因。
OK,新建一個入口類來執(zhí)行DemoService
的測試吧:
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();
}
}
最終的項目結(jié)構(gòu)如圖
打包
一切準(zhǔn)備就緒垂蜗,輪到項目打包了楷扬,在項目根目錄執(zhí)行以下Maven命令即可
mvn clean package
執(zhí)行完成后你會發(fā)現(xiàn)target
目錄的結(jié)構(gòu)如圖所示
project-one.zip就是我們要的打包結(jié)果,解壓后你會發(fā)現(xiàn)贴见,依賴包和配置文件已經(jīng)放在了各自的目錄下
執(zhí)行文件
項目開發(fā)完成烘苹,接下來就是執(zhí)行程序了,以Windows平臺下為例片部,首先創(chuàng)建bin
目錄镣衡,目錄中創(chuàng)建批處理文件setenv.bat
、project-one.bat
因為jar包與配置文件的分離档悠,所以我們需要指定執(zhí)行jar包時的classpath
廊鸥,批處理文件內(nèi)容如下:
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
bat文件的內(nèi)容就不詳細(xì)解釋,有興趣可以百度了解一下辖所,主要是為了拼接出完整的CLASSPATH
惰说,執(zhí)行project-one-0.0.1.jar
可執(zhí)行jar包
運(yùn)行
點擊project-one.bat
運(yùn)行程序
結(jié)語
項目終于開發(fā)演示完畢,這里只是創(chuàng)建一個打造可執(zhí)行jar包的子項目作為例子缘回,你還可以創(chuàng)建多個子項目吆视,最后打包的時候合并相同的依賴和配置文件典挑,然后在bin
中創(chuàng)建相應(yīng)項目的執(zhí)行文件即可,各個子項目之間也可進(jìn)行相互依賴啦吧。
以上開發(fā)技巧不僅適用于可執(zhí)行jar包的開發(fā)搔弄,同樣適用于WEB項目的開發(fā),具體還是由項目需求決定丰滑。
文章項目源碼已發(fā)布到Github:https://github.com/ZKHDEV/MultDependPjo
本文為作者kMacro原創(chuàng),轉(zhuǎn)載請注明來源:http://www.reibang.com/p/3fa98dd52520倒庵。