剑指架构师系列-持续集成之Maven实现项目的编译、发布和部署

Maven组织项目进行编译、部署

Maven项目基本的结构说明如下:

mazhi  // 控制所有荐的编译、部署、发布

mazhi-app-parent  // 项目的父项目,有一些公共的设置可以被子项目继承

mazhi-core  // 基础服务项目,例如公共类等

mazhi-xxx

其中mazhi和mazhi-app-parent是pom格式,而mazhi-core是jar格式,还可以是 war等格式。

我们以新建mazhi和mazhi-core项目为例说明一下。

新建Maven-project项目,过程配置如下:

注意在“Create a simple project”前打钩。

填写Group Id,Artifact Id,选择Packaging为pom 格式后,Finish即可。

同样的方式新建mazhi-app-parent模块,不过需要指定父模块为mazhi,如下:

新建父模块mazhi下的子模块mazhi-core,选择Maven-Module,指定父类为mazhi,如下:

一路点下去即可。

项目完成新建后如下:

不过我们需要做一下调整,现在是mazhi-core直接继承了mazhi项目的配置,现在要继承mazhi-app-parent来继承配置,打开mazhi-core模块下的pom.xml文件,修改如下节点:

<parent>
    <groupId>org.mazhi</groupId>
    <artifactId>mazhi-app-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../mazhi-app-parent</relativePath>
  </parent>

注意添加relativePath节点。

在mazhi项目下,右键pom.xml文件,选择Run as >> Maven Install后,Eclipse输出如下信息表示一切顺利!!

项目已经Build和Install了。我们可以看上一节的内容,将mazhi-core编译为jar包后扔到Nexus私服上,以便所有人引用这个公共类。

下面来了解一下Maven模块的基本结构,如下:

下面我们就可以基于Maven来组织项目的整个结构了。

Maven项目(根目录)
   |----src
   |     |----main
   |     |         |----java ——存放项目的.java文件
   |     |         |----resources ——存放项目资源文件,如spring boot, hibernate配置文件
   |     |----test
   |     |         |----java ——存放所有测试.java文件,如JUnit测试类
   |      |         |----resources ——存放项目资源文件,如spring boot, hibernate等配置文件
   |----target ——项目输出位置
   |----pom.xml ----Maven的配置文件

根据mazhi-core模块的pom.xml中配置说明如下:

<?xml version="1.0"?>
<project 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.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <!-- 项目的父项目 -->
    <parent>
       <groupId>org.mazhi</groupId>
       <artifactId>mazhi-app-parent</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <relativePath>../mazhi-app-parent</relativePath>
    </parent>

    <!-- groupId: groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app -->
    <groupId>org.mazhi</groupId>

    <!-- artifactId: 项目的通用名称 -->
    <artifactId>mazhi-core</artifactId>

    <!-- packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par -->
    <packaging>jar</packaging>

    <!-- version:项目的版本 -->
    <version>SNAPSHOT-0.0.1</version>

    <!-- 项目的名称, Maven 产生的文档用 -->
    <name>Mazhi Core</name>

    <!-- 哪个网站可以找到这个项目,提示如果 Maven 资源列表没有,可以直接上该网站寻找, Maven 产生的文档用 -->
    <url>http://mazhi.org</url>

    <!-- 项目的描述, Maven 产生的文档用 -->
    <description>A maven project to study maven.</description>

    <!-- 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 -->
    <distributionManagement>
        <repository>
            <id>nexus-releases</id>
            <url>http://ip:端口/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <url>http://ip:端口/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

    <!-- 依赖关系 -->
    <dependencies>
         <!-- 自动加入的依赖包,它们是通过项目坐标来找到依赖包的。所以用了maven之后就不需要再拷jar包了 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <!-- 依赖的范围:默认为compile -->
            <!--     test:测试范围有效。即编译和打包时不会加入该依赖包 -->
            <!--  compile:编译范围有效。即编译和打包时会将该依赖包一并加入 -->
            <!-- provided:编译和测试时有效,最后生成war包时不会加入该依赖包。比如web容器本身已包含的servlet-api.jar,再打包则会冲突 -->
            <!--  runtime:运行范围有效,编译时则不依赖 -->
            <scope>test</scope>
            <!-- <exclusions><exclusion></exclusion></exclusions> -->
            <!-- - exclusions表示只包括指定的项目,不包括相关的依赖。试想一下,两个三方jar依赖不同版本的日志包jar,项目会知道应该使用哪个吗?答案是否定的 -->
        </dependency>
    </dependencies>

</project>

  

微服务开发之Spring Boot

我们新建一个Maven Module,父类是mazhi,然后和mazhi-core模块一样,更改父模块为mazhi-app-parent。

在mazhi项目中的pom.xml中指定一些配置,如下:

<properties>
		<!-- 表示项目根目录 -->
		<main.basedir>${basedir}/..</main.basedir>
		<java.version>1.7</java.version>
		<spring.version>4.1.4.RELEASE</spring.version>
		<hibernate.api.version>1.0.1.Final</hibernate.api.version>
</properties>
<dependencyManagement>
		<dependencies>
			<dependency>
				Import dependency management from spring boot
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>1.2.1.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
</dependencyManagement>

这样子模块就可以引用这些属性。

在mazhi-app-parent项目中,配置spring boot集成maven的插件,如下:

 <!--  安装spring boot集成Maven的插件 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

在mazhi-service模块中引入Spring boot的包,如下:

 <!-- Add typical dependencies for a web application -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

在 org.mazhi.service包中新建Application.class类,内容如下:

package org.mazhi.service;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
public class Application {

    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

添加Spring boot的配置文件,放到java/main/resource下,内容如下:

# Server settings (ServerProperties)
server:
  port: 8090
  sessionTimeout: 30
#  contextPath: /

  # Tomcat specifics
  tomcat:
    accessLogEnabled: false
    protocolHeader: x-forwarded-proto
    remoteIpHeader: x-forwarded-for
    basedir:
    backgroundProcessorDelay: 30 # secs

management:
  address: 127.0.0.1
  port: 8090

info:
  app:
    name: springtest
    description: spring test
    version: 1.0.0

注意缩近和格式,不要随便做对齐什么的操作,这是一种约定。 

在这个类上右键,Run As >> Java Application,可以看到Eclipse的控制台输出如下信息,表示启动成功!!

可以用浏览器去访问一下这个服务,地址为:

http://localhost:8090/

浏览器会输出:

Hello World!

如果我们想要引用mazhi-core中的工具类,那么可以在 mazhi-service中引入,如下:

在<dependencies>节点中添加如下依赖:

  <dependency>
			<groupId>org.mazhi</groupId>
			<artifactId>mazhi-core</artifactId>
			<version>0.0.1-SNAPSHOT</version>
	   </dependency>

如果这时候没有对mazhi-core进行build和instaling过程时,可能会报错,需要对mazhi-core模块install一下,然后进行引入即可。

Maven项目有时候本身没错,但是项目名上显示红叉,这时候只要更新一下项目即可。

项目上右键 >> Maven >> Update Project .. 即可。

或者还报错的话,需要先运行mazhi项目下的pom.xml文件,install一下,保证几个子模块成功进行了build和installing过程。

 

时间: 2024-10-11 00:55:59

剑指架构师系列-持续集成之Maven实现项目的编译、发布和部署的相关文章

剑指架构师系列-持续集成之Maven+Nexus+Jenkins+git+Spring boot

1.Nexus与Maven 先说一下这个Maven是什么呢?大家都知道,Java社区发展的非常强大,封装各种功能的Jar包满天飞,那么如何才能方便的引入我们项目,为我所用呢?答案就是Maven,只需要粘贴个Jar包的地址,Maven就会自动到网上查找引入到你的项目中.不过首先你的下载个Maven,然后指定一下 当下来的包包(jar)放到哪里. 我的版本是apache-maven-3.2.1,找到conf里面的配置文件 settings.xml,瞅瞅有没有 <localRepository>E:

剑指架构师系列-spring boot的logback日志记录

Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志对象,也可以定义日志类型.级别. 级别:ERROR.WARE.INFO.DEBUG和TRACE.没有FATAL,归纳到了ERROR级别里.ERROR.WARN and INFO level messages are logged by default. 在Spring Boot中,最好定义为logb

剑指架构师系列-Redis安装与使用

1.安装Redis 我们在VMware中安装CentOS 64位系统后,在用户目录下下载安装Redis. 下载redis目前最稳定版本也是功能最完善,集群支持最好并加入了sentinel(哨兵-高可用)功能的redis-stable版, http://download.redis.io/releases/ wget http://download.redis.io/releases/redis-stable.tar.gz tar -xzvf redis-stable.tar.gz cd redi

剑指架构师系列-MySQL的安装及主从同步

1.安装数据库 wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql-community-server 安装时使用root用户权限.安装成功后即可进行启动: /bin/systemctl restart mysqld.service 修改MySQL数据库root用户的密码,如

剑指架构师系列-Linux下的调优

1.I/O调优 CentOS下的iostat命令输出如下: $iostat -d -k 1 2 # 查看TPS和吞吐量 参数 -d 表示,显示设备(磁盘)使用状态:-k某些使用block为单位的列强制使用Kilobytes为单位:1 10表示,数据显示每隔1秒刷新一次,共显示2次. tps:该设备每秒的传输次数,也就是一次I/O请求.多个逻辑请求可能会被合并为"一次I/O请求"."一次传输"请求的大小是未知的. kB_read/s:每秒从设备读取的数据量:kB_wr

剑指架构师系列-Redis集群部署

初步搭建Redis集群 克隆已经安装Redis的虚拟机,我们使用这两个虚拟机中的Redis来搭建集群. master:192.168.2.129 端口:7001 slave:192.168.2.132 端口:7002 sentinel:192.168.2.129 端口:26379 来说一下这个sentinel,sentinel是一个管理redis实例的工具,它可以实现对redis的监控.通知.自动故障转移.sentinel不断的检测redis实例是否可以正常工作,通过API向其他程序报告redi

剑指架构师系列-ActiveMQ队列的使用

安装ActiveMQ只需要下载包后解压,然后就可以启动与关闭ActiveMQ了,如下: ./activemq start ./activemq stop 访问管理页面: http://10.10.20.20:8161/admin 用户名和密码默认为:admin/admin spring.activemq.broker-url -- 指定ActiveMQ broker的URL,默认自动生成. spring.activemq.in-memory -- 是否是内存模式,默认为true. spring.

剑指架构师系列-tomcat6通过伪异步实现connector

首先在StandardService中start接收请求的线程,如下: synchronized (connectors) { for (int i = 0; i < connectors.length; i++) { try { ((Lifecycle) connectors[i]).start(); } catch (Exception e) { log.error(sm.getString("standardService.connector.startFailed",co

剑指架构师系列-Struts2的缓存

Struts2的缓存中最重要的两个类就是ReferenceMap与ReferenceCache.下面来解释下ReferenceCache中的get()方法. public V get(final Object key) { V value = super.get(key); return (value == null) ? internalCreate((K) key) : value; } 通过key来获取value操作首先调用了super.get(key)方法,也就是调用了Reference