图片 1

图片 2

图片 2

前言

本篇小说基于Java开辟小技艺(二):自定义Maven重视中开创的父工程project-monitor福寿年高,运用大家自定义的依附包实行多工程正视项目标付出。

下面以多可进行Jar包项目标付出为例,实行Maven多工程注重项目支付的讲课。

前言

本篇作品基于Java开辟小手艺(二):自定义Maven注重中创制的父工程project-monitor贯彻,运用大家自定义的借助包进行多工程重视项目标支付。

上边以多可实行Jar包项目标支付为例,进行Maven多工程正视项目支出的任课。

前言

本篇文章基于Java开采小技能(二):自定义Maven依赖中开创的父工程project-monitor贯彻,运用大家自定义的借助包举办多工程依赖项目标开荒。

上边以多可进行Jar包项目标开支为例,进行Maven多工程依赖项目支出的授课。

要求分析

第一来看一下封面图,我们要贯彻的成效是:
1.七个门类分享一个项指标类和方法等通用内容
2.每一种子项目单独导入所需依赖,以及分级填充父项目安插文件中的占位符
3.子项目按钦命目录结构举办李包裹装
4.全部子项目并入打包到多个联结的目录,分享正视包和配置文件等内容
5.打包后目录结构:

  • bin:寄存脚本文件,用来设置情形变量,实践相应的jar包
  • lib:依赖、项目jar包
  • etc:配置文件
  • ……

好啊,指标分明的,接下去要拓展实际开销完结了

需要剖判

先是来看一下封面图,大家要落实的效果是:
1.八个项目分享一个品种的类和格局等通用内容
2.每种子项目单独导入所需依附,以及分级填充父项目布置文件中的占位符
3.子项目按钦点目录结构进行打包
4.全部子项目并入打包到多少个联合的目录,共享注重包和布署文件等剧情
5.打包后目录结构:

  • bin:寄存脚本文件,用来安装情形变量,推行相应的jar包
  • lib:依赖、项目jar包
  • etc:配置文件
  • ……

好啊,目的显著的,接下去要拓展具体支出完结了

需要深入分析

第一来看一下封面图,我们要完结的作用是:
1.七个项目分享贰个品种的类和艺术等通用内容
2.每一个子项目单独导入所需依据,以及分级填充父项目铺排文件中的占位符
3.子项目按钦赐目录结构举办打包
4.全数子项目并入打包到叁个统一的目录,分享依赖包和布署文件等剧情
5.打包后目录结构:

  • bin:寄放脚本文件,用来设置景况变量,实行相应的jar包
  • lib:依赖、项目jar包
  • etc:配置文件
  • ……

好啊,目的鲜明的,接下去要拓展具体花费达成了

实现

实现

实现

包装配置

在上一篇著作中一度成立好了一个自定义的Maven注重,也就是叁个父项目,接下去大家新建一个子项目,命名叫project-onepom.xml文本与父项目基本同样,全数依赖包都必须独立引进,差别的是多了对父项目标依附:

<dependency>
    <groupId>com.demo</groupId>
    <artifactId>project-monitor</artifactId>
    <version>0.0.1</version>
</dependency>

以及Maven插件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文件

卷入配置

在上一篇小说中早就制造好了一个自定义的Maven信赖,也正是一个父项目,接下去大家新建一个子项目,命名称为project-onepom.xml文件与父项目基本一样,全部信赖包都无法不独立引入,差别的是多了对父项指标重视:

<dependency>
    <groupId>com.demo</groupId>
    <artifactId>project-monitor</artifactId>
    <version>0.0.1</version>
</dependency>

以及Maven插件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文件

打包配置

在上一篇文章中早已创办好了叁个自定义的Maven注重,相当于叁个父项目,接下去我们新建二个子项目,命名称叫project-onepom.xml文本与父项目基本一样,全部重视包都不能够不独立引进,区别的是多了对父项指标正视性:

<dependency>
    <groupId>com.demo</groupId>
    <artifactId>project-monitor</artifactId>
    <version>0.0.1</version>
</dependency>

以及Maven插件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文件

填充配置文件占位符

事先大家在父项目标spring上下文中定义了一个数据源bean,配置音信使用了占位符填充,所以纵然大家想要使用那么些bean,就供给替换当中的占位符音信,要如何是好吗?
第一当然是创制布局文件了,在类型中开创jdbc.propertiesJDBC配置文件,如:

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其一类来兑现,在品种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"/>

填充配置文件占位符

前边大家在父项指标spring上下文中定义了三个数额源bean,配置新闻应用了占位符填充,所以只要大家想要使用那么些bean,就须求替换当中的占位符消息,要如何做吧?
首先当然是创办布局文件了,在品种中开创jdbc.propertiesJDBC配置文件,如:

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本条类来促成,在类型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"/>

填充配置文件占位符

事先大家在父项指标spring上下文中定义了二个数码源bean,配置音讯使用了占位符填充,所以一旦我们想要使用那些bean,就需求替换在那之中的占位符音信,要如何是好吧?
先是当然是创设布局文件了,在项目中创设jdbc.propertiesJDBC配置文件,如:

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这一个类来落到实处,在项目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

好了,接下去来测量试验项指标可行性,首要达成选用父项目概念的多少源来对MySql进行查询。
先创制二个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.properties布署文件,这里就不贴出文件内容了。
OK,新建一个入口类来进行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();
    }
}

说起底的类型结构如图
图片 4

测试Demo

好了,接下去来测量检验项目的可行性,首要实现利用父项目概念的多寡源来对MySql实行查询。
先创设多个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.properties配置文件,这里就不贴出文件内容了。
OK,新建三个入口类来推行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();
    }
}

末尾的档案的次序组织如图
图片 5

测试Demo

好了,接下去来测量试验项指标主旋律,主要落成采纳父项目概念的数码源来对MySql举行询问。
先成立一个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.properties布置文件,这里就不贴出文件内容了。
OK,新建二个入口类来举办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();
    }
}

终极的花色组织如图
图片 5

打包

一切希图稳当,轮到项目打包了,在类型根目录实行以下Maven命令就可以

mvn clean package

实施到位后您会发觉target目录的组织如图所示
图片 7
project-one.zip正是大家要的打包结果,解压后您会发觉,依赖包和铺排文件已经位于了独家的目录下
图片 8

打包

整整准备妥贴,轮到项目打包了,在品种根目录施行以下Maven命令就能够

mvn clean package

举办到位后您会意识target目录的协会如图所示
图片 9
project-one.zip正是大家要的打包结果,解压后你会发觉,正视包和安顿文件已经放在了独家的目录下
图片 10

打包

整个希图妥帖,轮到项目打包了,在品种根目录试行以下Maven命令就能够

mvn clean package

实施到位后你会发觉target目录的结构如图所示
图片 9
project-one.zip就是大家要的打包结果,解压后您会发觉,注重包和配备文件已经身处了个别的目录下
图片 10

进行文书

品类开销完毕,接下去正是试行顺序了,以Windows平台下为例,首先创设bin目录,目录中开创批管理文件setenv.batproject-one.bat
因为jar包与布局文件的握别,所以大家须求钦定实践jar包时的classpath,批管理文件内容如下:

执行文书

项目成本产生,接下去正是举办顺序了,以Windows平台下为例,首先创立bin目录,目录中成立批管理文件setenv.batproject-one.bat
因为jar包与布局文件的分离,所以大家要求内定施行jar包时的classpath,批管理文件内容如下:

进行理文件书

品类开支形成,接下去就是进行顺序了,以Windows平台下为例,首先创制bin目录,目录中创立批管理文件setenv.batproject-one.bat
因为jar包与安排文件的分别,所以大家必要钦定施行jar包时的classpath,批管理文件内容如下:

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

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

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文件的源委就不详细解释,有野趣能够百度了然一下,重假如为着拼接出完全的CLASSPATH,执行project-one-0.0.1.jar可执行jar包

project-one.bat

@echo off
@setlocal enableextensions enabledelayedexpansion
call setenv.bat

chcp 65001
java -cp %CLASSPATH% com.demo.project.one.Application
pause

bat文件的内容就不详细分解,有野趣能够百度问询一下,首假若为着拼接出完全的CLASSPATH,执行project-one-0.0.1.jar可执行jar包

project-one.bat

@echo off
@setlocal enableextensions enabledelayedexpansion
call setenv.bat

chcp 65001
java -cp %CLASSPATH% com.demo.project.one.Application
pause

bat文件的内容就不详细解释,有意思味能够百度问询一下,首就算为了拼接出一体化的CLASSPATH,执行project-one-0.0.1.jar可执行jar包

运行

点击project-one.bat运维程序
图片 13

运行

点击project-one.bat运转程序
图片 14

运行

点击project-one.bat运维程序
图片 14

结语

品类终于开采示范完成,这里只是创立二个创造可实行jar包的子项目作为例子,你还足以创立三个子项目,最后打包的时候合併同样的注重和布置文件,然后在bin中开创相应类别的进行文书就可以,各种子项目之间也可进展互相信赖。
上述开辟才具不止适用于可履行jar包的支出,一样适用于WEB项目标开垦,具体如故由项目必要决定。

作品项目源码已宣布到Github:

正文为小编kMacro原创,转发请表明来源:。

结语

花色终于开拓示范完成,这里只是创造二个制作可举办jar包的子项目作为例子,你还足以创设多个子项目,最后打包的时候合併一样的注重和计划文件,然后在bin中成立相应品种的实践文书就能够,各样子项目之间也可进展相互正视。
以上开荒才具不仅仅适用于可进行jar包的费用,同样适用于WEB项目标支付,具体依然由项目必要决定。

作品项目源码已揭橥到Github:

本文为笔者kMacro原创,转发请注解来源:。

结语

花色终于开辟示范达成,这里只是成立多个创造可施行jar包的子项目作为例子,你仍是能够创建多少个子项目,最终打包的时候合併相同的注重和布局文件,然后在bin中创造相应品种的推行文书就能够,各样子项目之间也可举办相互依赖。
上述开采技艺不止适用于可施行jar包的支出,同样适用于WEB项指标付出,具体依旧由项目须求决定。

文章项目源码已公告到Github:

本文为作者kMacro原创,转发请声明来源:。

相关文章