zoukankan      html  css  js  c++  java
  • springboot项目中使用maven resources

    maven resource 组件可以把pom的变量替换到相关的resouces目录中的资源文件变量

    示例项目:内容中心 (文章管理)  生成jar包,生成docker ,生成k8s文件

    1.项目结构

    ├── content-api
    │   ├── pom.xml
    │   └── src
    │       ├── main
    │       │   └── java
    │       │       └── com
    │       │           └── itstudy
    │       │               └── content_api
    │       │                   ├── domain
    │       │                   │   └── ArticleInfo.java
    │       │                   └── service
    │       │                       └── ArticleService.java
    │       └── test
    │           └── java
    │               └── com
    │                   └── itstudy
    │                       └── content_api
    │                           └── AppTest.java
    ├── content-server
    │   ├── pom.xml
    │   └── src
    │       ├── bin
    │       │   └── app.sh
    │       ├── main
    │       │   ├── java
    │       │   │   └── com
    │       │   │       └── itstudy
    │       │   │           └── content_server
    │       │   │               ├── ContentServerApp.java
    │       │   │               ├── controller
    │       │   │               │   └── ArticleController.java
    │       │   │               └── service
    │       │   │                   └── impl
    │       │   │                       └── ArticleServiceImpl.java
    │       │   └── resources
    │       │       ├── dev
    │       │       │   ├── application.yml
    │       │       │   ├── docker
    │       │       │   │   └── Dockerfile
    │       │       │   └── k8s
    │       │       │       ├── content-center-rc.yml
    │       │       │       └── content-center-svc.yml
    │       │       └── pro
    │       │           ├── application.yml
    │       │           ├── docker
    │       │           │   └── Dockerfile
    │       │           └── k8s
    │       │               ├── content-center-rc.yml
    │       │               └── content-center-svc.yml
    │       └── test
    │           └── java
    │               └── com
    │                   └── itstudy
    │                       └── content_api
    │                           └── ContentServerAppTest.java
    └── pom.xml

    2. 父级项目pom文件 

    <?xml version="1.0" encoding="UTF-8"?>
    
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.itstudy</groupId>
        <artifactId>contentcenter</artifactId>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>content-api</module>
            <module>content-server</module>
        </modules>
    
        <packaging>pom</packaging>
        <name>contentcenter</name>
    
        <parent>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-parent</artifactId>
            <version>Camden.SR5</version>
            <relativePath></relativePath>
        </parent>
    
        <distributionManagement>
            <!-- 两个ID必须与 setting.xml中的<server><id>nexus-releases</id></server>保持一致 -->
            <repository>
                <id>nexus-releases</id>
                <name>Nexus Release Repository</name>
                <url>http://maven.mysite.com/nexus/content/repositories/demo-Release/</url>
            </repository>
            <snapshotRepository>
                <id>nexus-snapshots</id>
                <name>Nexus Snapshot Repository</name>
                <url>http://maven.mysite.com/nexus/content/repositories/demo-Snapshot/</url>
            </snapshotRepository>
        </distributionManagement>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <configuration>
                        <attach>true</attach>
                    </configuration>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>jar-no-fork</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!-- 使用dockerfile方式
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.11</version>
                    <configuration>
                        <imageName>dockerimage.mysite.com/contentcenter/${project.artifactId}</imageName>
                        <imageTags>contentcenter-${project.version}</imageTags>
                        <dockerDirectory>src/main/docker</dockerDirectory>
                        <serverId>docker-image</serverId>
                        <useConfigFile>true</useConfigFile>
                        <resources>
                            <resource>
                                <targetPath>/</targetPath>
                                <directory>${project.build.directory}</directory>
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>
                -->
                <!--使用配置方式-->
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.11</version>
                    <configuration>
                        <imageName>dockerimage.mysite.com/contentcenter/${project.artifactId}</imageName>
                        <baseImage>dockerimage.mysite.com/java/alpine-oraclejdk8:8.131.11-slim</baseImage>
                        <imageTags>contentcenter-${project.version}</imageTags>
                        <maintainer>my@mail.com</maintainer>
                        <entryPoint>["java", "-Djava.security.egd=file:/dev/./urandom","-jar", "${project.build.finalName}.jar"]</entryPoint>
                        <volumes>
                            <volume>/tmp</volume>
                        </volumes>
                        <serverId>docker-image</serverId>
                        <resources>
                            <resource>
                                <targetPath>/</targetPath>
                                <directory>${project.build.directory}</directory>
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

    2.2实体类

    package com.itstudy.content_api.domain;
    
    public class ArticleInfo {
        private String id;
        private String content;
    
        //省略geter setter
    
    }

    2.3接口

    package com.itstudy.content_api.service;
    
    import com.itstudy.content_api.domain.ArticleInfo;
    
    public interface ArticleService {
    
        void insert(ArticleInfo item);
    
        void update(ArticleInfo item);
    
    }

    3 content-server项目 具体业务服务

    3.1 pom文件 

    <?xml version="1.0" encoding="UTF-8"?>
    
    <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/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>contentcenter</artifactId>
            <groupId>com.itstudy</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>content-server</artifactId>
    
        <name>content-server</name>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.itstudy</groupId>
                <artifactId>content-api</artifactId>
                <version>1.0-SNAPSHOT</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    
        <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <profile-name>pro</profile-name>
                <app-mongodb-replica-set>192.168.146.8:27017,192.168.146.9:27017,192.168.146.10:27017</app-mongodb-replica-set>
                <app-mongodb-credentials>username:password@dbname-test</app-mongodb-credentials>
                <app-mongob-db>dbname-test</app-mongob-db>
                <plateform-ds>http://192.168.146.76:50002/eureka/</plateform-ds>
                <app-dfs1>192.168.146.11:22122</app-dfs1>
                <app-dfs2>192.168.146.11:22122</app-dfs2>
                <app-dfs-sotimeout>1501</app-dfs-sotimeout>
                <app-dfs-connecttimeout>601</app-dfs-connecttimeout>
                <app-name>${project.name}</app-name>
                <app-port>8080</app-port>
            </properties>
        </profile>
        <profile>
            <id>pro</id>
            <properties>
                <profile-name>pro</profile-name>
                <app-mongodb-replica-set>192.168.146.8:27017,192.168.146.9:27017,192.168.146.10:27017</app-mongodb-replica-set>
                <app-mongodb-credentials>username:password@dbname</app-mongodb-credentials>
                <app-mongob-db>dbname</app-mongob-db>
                <plateform-ds>http://ds:8761/eureka/</plateform-ds>
                <app-dfs1>192.168.146.11:22122</app-dfs1>
                <app-dfs2>192.168.146.11:22122</app-dfs2>
                <app-dfs-sotimeout>1501</app-dfs-sotimeout>
                <app-dfs-connecttimeout>601</app-dfs-connecttimeout>
                <app-port>8080</app-port>
                <app-name>${project.name}</app-name>
            </properties>
        </profile>
        </profiles>
    
        <build>
            <resources>
                <resource>
                    <directory>${project.basedir}/src/main/resources</directory>
                    <excludes>
                        <exclude>dev/**</exclude>
                        <exclude>pro/**</exclude>
                    </excludes>
                </resource>
                <resource>
                    <directory>${project.basedir}/src/main/resources/${profile-name}</directory>
                    <filtering>true</filtering>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.yml</include>
                        <include>**/*.xml</include>
                        <include>**/Dockerfile</include>
                    </includes>
                </resource>
                <resource>
                    <directory>${project.basedir}/src/main/resources/</directory>
                    <filtering>false</filtering>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
            </resources>
            <plugins>
                <!--不加此组件,会导至jar包启动时找不到manifest-->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
    </build> 
    
    </project>

    3.2  service.impl

    package com.itstudy.content_server.service.impl;
    
    import com.itstudy.content_api.domain.ArticleInfo;
    import com.itstudy.content_api.service.ArticleService;
    import org.springframework.stereotype.Service;
    
    @Service
    public class ArticleServiceImpl implements ArticleService {
        @Override
        public void insert(ArticleInfo item) {
    
        }
    
        @Override
        public void update(ArticleInfo item) {
    
        }
    }

    3.3 controller

    package com.itstudy.content_server.controller;
    
    import com.itstudy.content_api.domain.ArticleInfo;
    import com.itstudy.content_api.service.ArticleService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/article")
    public class ArticleController {
    
        @Autowired
        ArticleService articleService;
    
        @PostMapping("/insert")
        public void postInsert(@RequestBody ArticleInfo info){
            //其它业务
        }
    
        @PostMapping("/update")
        public void postUpdate(@RequestBody ArticleInfo info){
            //其它业务
        }
    }

    3.4 springboot 启动类app

    package com.itstudy.content_server;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    /**
     * 项目启动类
     */
    @SpringBootApplication
    @EnableEurekaClient
    public class ContentServerApp
    {
        public static void main( String[] args )
        {
            System.out.println("内容中心-启动中...");
    
            SpringApplication.run(ContentServerApp.class, args);
    
            System.out.println("内容中心-启动成功");
        }
    }

    3.5 resources目录

    3.5.1 resources/dev/docker/Dockerfile

    FROM dockerimage.mysite.com/java/alpine-oraclejdk8:8.131.11-slim
    VOLUME /tmp
    ADD  @project.build.finalName@.jar app.jar
    RUN sh -c 'touch /app.jar'
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"

    3.5.2 resource/dev/k8s/rc 及 resources/dev/k8s/svc

    1) rc文件

    apiVersion: v1
    
    kind: ReplicationController
    
    metadata:
    
      name: @project.artifactId@
    
    spec:
    
      replicas: 1
    
      selector:
    
        name: @project.artifactId@
    
      template:
    
        metadata:
    
          labels:
    
            name: @project.artifactId@
    
        spec:
          containers:
    
            - name: api
    
              image: dockerimage.mysite.com/@app-name@/@app-name@
              ports:
                - containerPort: 8080

    2)svc文件

    apiVersion: v1
    
    kind: Service
    
    metadata:
    
      name: @app-name@  #也可替换为 @project.artifactId@
    
    spec:
    
      selector:
    
        name: @app-name@ #也可替换为 @project.artifactId@
    
      ports:
    
        - name: http
    
          port: 8080
    
          protocol: TCP
          nodePort: 30008
      type: NodePort

    3.6 application.yml文件 

    server:
      port: @app-port@
    spring:
      application:
        name:  @app-name@  # 项目名称尽量用小写
      jmx:
        enabled: false
    hystrix:
      command:
        default:
          execution:
            timeout:
              enabled: false
    eureka:
      client:
        serviceUrl:
          defaultZone: @plateform-ds@    # 指定注册中心的地址
      instance:
        preferIpAddress: true
    fdfs:
      soTimeout: @app-dfs-sotimeout@
      connectTimeout: @app-dfs-connecttimeout@
      thumbImage:             #缩略图生成参数
         150
        height: 150
      trackerList:            #TrackerList参数,支持多个
        - @app-dfs1@
        - @app-dfs2@

    3.7 resource/pro文件夹与dev文件夹文件相似,只是个别配置不同。

    4.重要总结

    4.1 在pom文件中,引用maven变量使用 ${变量名}即可

    4.2 在springboot项目中,使用maven resources组件时,使用@变量名@ 进行取值(因为springboot项目中进行了特殊处理)

    4.3 在使用maven resources组件时

    <excludes>
    <exclude>dev/**</exclude>
    <exclude>pro/**</exclude>
    </excludes>

    * 匹配 0或N个字符
    ** 匹配 0或N个目录
    如果使用*不能实现相应功能,请切换** 即可

    4.4 在使用maven resources组件时,只要增加了resource这个节点,必须重新指定resources文件夹位置 

    如示例: https://www.cnblogs.com/liuxm2017/p/10688789.html

  • 相关阅读:
    Jocke的IOT之路--raspberrypi更换国内镜像
    利用PostMan 模拟上传/下载文件
    Java中的Lambda表达式
    设计模式之Jdk动态代理
    设计模式之代理模式
    Java内存模型及Java关键字 volatile的作用和使用说明
    JVM GC-----4、finalize()方法
    JVM GC-----3、垃圾对象的标记思路(二)
    JVM GC-----2、垃圾对象的标记思路(一)
    JVM GC-----1、垃圾回收算法
  • 原文地址:https://www.cnblogs.com/liuxm2017/p/11078462.html
Copyright © 2011-2022 走看看