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过程。

 

 
 
 
 
 
 
 
 
 
 
 

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

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

    1.Nexus与Maven 先说一下这个Maven是什么呢?大家都知道,Java社区发展的非常强大,封装各种功能的Jar包满天飞,那么如何才能方便的引入我们项目,为我所用呢?答案就是Maven,只需要 ...

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

    Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志 ...

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

    1.安装Redis 我们在VMware中安装CentOS 64位系统后,在用户目录下下载安装Redis. 下载redis目前最稳定版本也是功能最完善,集群支持最好并加入了sentinel(哨兵-高可用 ...

  4. 剑指架构师系列-tomcat6通过IO复用实现connector

    由于tomcat6的配置文件如下: <Connector port="80" protocol="org.apache.coyote.http11.Http11Ni ...

  5. 剑指架构师系列-Struts2构造函数的循环依赖注入

    Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...

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

    首先在StandardService中start接收请求的线程,如下: synchronized (connectors) { for (int i = 0; i < connectors.le ...

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

    Struts2的缓存中最重要的两个类就是ReferenceMap与ReferenceCache.下面来解释下ReferenceCache中的get()方法. public V get(final Ob ...

  8. 剑指架构师系列-Hibernate需要掌握的Annotation

    1.一对多的关系配置 @Entity @Table(name = "t_order") public class Order { @Id @GeneratedValue priva ...

  9. 剑指架构师系列-InnoDB存储引擎、Spring事务与缓存

    事务与锁是不同的.事务具有ACID属性: 原子性:持久性:由redo log重做日志来保证事务的原子性和持久性,一致性:undo log用来保证事务的一致性隔离性:一个事务在操作过程中看到了其他事务的 ...

随机推荐

  1. 【原创】自己动手实现RPC服务调用框架

    自己动手实现rpc服务调用框架 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者).battercake- ...

  2. hdu-2602&&POJ-3624---01背包裸题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2602 https://vjudge.net/problem/POJ-3624 都是01背包的裸题 这 ...

  3. dict的update方法

    dict = {'Name': 'Zara', 'Age': 7} dict2 = {'Sex': 'female' } dict.update(dict2)输出结果:{'Age': 7, 'Name ...

  4. scrapy 选择器官方文档

    当抓取网页时,常见的任务是从HTML源码中提取数据.现有的一些库可以达到这个目的: BeautifulSoup lxml Scrapy 提取数据有自己的一套机制.它们被称作选择器(seletors), ...

  5. springCloud 微服务框架搭建入门(很简单的一个案例不喜勿扰)

    Spring cloud 实现服务注册及发现 服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. clou ...

  6. 从零开始系列之vue全家桶(6)实战前的设计

    搭建好基本框架后我们应该先想一想个人博客应该有哪些功能呢? 为了更好的适应企业的要求,这里我将搭建一个非典型的博客. 在全部采用单页开发的情况下,使用vue-router,路由分别设置home.abo ...

  7. 开发一款APP所需要的时间

    "要多少钱""要多少时间"这应该是一个企业在打算开发一款APP时问到最多的问题了.的确,现在的人不管做什么事情都讲究计划,更何况在这个时间就是金钱的时代,企业如 ...

  8. [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点

    Given a non-empty special binary tree consisting of nodes with the non-negative value, where each no ...

  9. [HAOI 2011]Problem c

    Description 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了, ...

  10. ●洛谷P2934 [USACO09JAN]安全出行Safe Travel

    题链: https://www.luogu.org/problemnew/show/P2934 题解: 最短路(树),可并堆(左偏堆),并查集. 个人感觉很好的一个题. 由于题目已经明确说明:从1点到 ...