zoukankan      html  css  js  c++  java
  • idea构建maven多module项目

    前言

    搭建一个项目,看似简单,但是总会遇到一些奇奇怪怪的问题。

    新建parent项目

    新建一个springboot项目或者maven项目都可以,这个无所谓。

    设置项目的maven仓库和编码。

    建module

    在parent项目下新建多个module,新建springboot项目或者maven项目都可以。

    maven项目自己新建包的时候尽量按照groupId + artifactId的方式,如果artifactId是多个中划线连接,则去掉中划线,全小写拼接。

    打包

    新建完成上述项目之后,在parent下打包试一下,报错 “unable to find main class”。

    介绍一下maven的packaging标签:

    <packaging>pom</packaging>   --------->   父类型都为pom类型
    <packaging>jar</packaging>   --------->   内部调用或者是作服务使用
    <packaging>war</packaging>   --------->   需要部署的项目
    

    把packaging 改为pom,大致就是告诉maven,咱只是个外包装,你不用找什么 main 方法了。

    之后继续打包,发现没有一个module生成target目录

    介绍一下maven的modules标签:

    <modules>
        <module>moduleA</module>
        <module>moduleB</module>
        <module>moduleC</module>
    </modules>
    

    在parent项目的pom中加入modules标签,包含一下子模块,告诉maven,这都是我小弟。

    子模块读取父模块或其他子模块的resource文件

    首先说一下maven编译的时候处理相关文件的过程:

    构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。

    • src/main/java和src/test/java :
      这两个目录中的所有*.java文件会分别在comile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉。

    • src/main/resouces和src/test/resources
      这两个目录中的文件也会分别被复制到target/classes和target/test-classes目录中。

    • target/classes
      打包插件默认会把这个目录中的所有内容打入到jar包或者war包中。

    此部分参考:https://www.cnblogs.com/pixy/p/4798089.html

    了解了maven处理文件的过程,我们说一下maven的resources标签

    resources标签通常包含在build标签中;

        <build>
            <resources>
                <resource>
                    <directory>../src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
        </build>
    

    我们只需要配置resource的directory即可将其他模块的resource文件包含到本模块中。

    maven profile和spring profile整合

    其实就是想在application.properties文件中读取到pom中定义的变量

    先说maven profile,引入maven profile主要是为了做环境的分离:

        <profiles>
            <profile>
                <id>dev</id>
                <properties>
                    <!--主要这个标签名是自定义的-->
                    <activeProfile>dev</activeProfile>
                </properties>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
            </profile>
            <profile>
                <id>prod</id>
                <properties>
                    <activeProfile>prod</activeProfile>
                </properties>
            </profile>
        </profiles>
    

    在application.properties中指定spring.profiles.active=@activeProfile@

    maven编译的时候指定-P参数:mvn clean package -Pdev

    理想情况下,application.properties中会变成spring.profiles.active=dev

    但是,理想是丰满的,现实是骨感的,并没有成功,查了很多资料,很多人失败都是倒在了分隔符@@上,但是我并不是。。。

    后来发现注释掉resources标签打包就可以替换,使用resources标签就不行,定位到肯定是这儿出的问题。

    介绍一下resource标签下的filtering标签:
    filtering代表开启过滤,用指定的参数替换directory下的文件中的参数。。。

    然后在resource标签中加入filtering标签,设置为true就可以了

        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                    <includes>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
        </build>
    

    就这,啥也不是。。。

  • 相关阅读:
    高效求解素数
    搭建redis集群
    搭建Spark高可用集群
    redis持久化
    elasticsearch简介
    java反射机制
    hdfs的客户端操作
    hdfs运行机制
    大数据概念
    hive
  • 原文地址:https://www.cnblogs.com/lwmp/p/13737259.html
Copyright © 2011-2022 走看看