精华内容
下载资源
问答
  • 最近在研究怎么部署SpringCloud项目比较快速方便,发现打包SpringCloud项目各个微服务模块,打出的都很大(都是100多M)上传服务器都很久;找了下度娘,发现是把底下的依赖库lib都打包进去了,其实依赖库不需要...

    最近在研究怎么部署SpringCloud项目比较快速方便,发现打包SpringCloud项目各个微服务模块,打出的包都很大(都是100多M)上传服务器都很久;找了下度娘,发现是把底下的依赖库lib都打包进去了,其实依赖库不需要每次都打包,只有变动的时候需要打包,这样依赖库从包里面分离出来,打包后就只有10多kb大小;有了思路,就开始实践!但是中间自己折腾时还是遇到很多问题,发现自己对Maven很多知识点不懂。

    进入实践环节,需要搞清楚一些Maven的pom文件相关配置知识点

    一、dependencies与dependencyManagement管理的依赖库的区别

    1.dependencyManagement在父子层级模块关系中,可以进行版本的管理和相关依赖库的管理;如果在dependencyManagement标签里面声明了对应的依赖库和版本,那么子模块继承父模块,引入依赖库不需要显式的声明版本就可以用;如果子模块引入的依赖库需要版本不同,也可以声明自己的版本。
    如下父模块dependencyManagement管理mysql驱动版本依赖库:

    	<dependencyManagement>
            <dependencies>            
                <dependency>
                    <groupId>org.testcontainers</groupId>
                    <artifactId>mysql</artifactId>
                    <version>1.15.1</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    

    子模块要用到mysql驱动,可以直接如下声明引入依赖库:

    	 <dependencies>
            <dependency>
                <groupId>org.testcontainers</groupId>
                <artifactId>mysql</artifactId>
            </dependency>
        </dependencies>
    

    如果子模块需要自己的版本,直接在声明中加入自己的版本号就可以;如果是多个模块需要统一升级或修改版本,则只需要改父模块pom文件中dependencyManagement管理的版本;这样就达到了依赖库版本统一管理!

    2.dependencies在父子层级模块中,如果在父模块声明了依赖库,则子模块不需要再次声明就可以直接引用了。一般我们公用的依赖库都写在父模块pom文件中的dependencies标签里,子模块继承父模块后就会自动引入;如果子模块也声明了,根据强龙不压地头蛇,以子模块为准,需要注意的是版本号一定得写!

    二、Maven打包插件maven-jar-plugin和spring-boot-maven-plugin区别

    1.maven-jar-plugin打包不会把依赖库给打包进去,解压开里面会发现少了lib;而spring-boot-maven-plugin会把依赖库一起打包进jar包。

    2.spring-boot-maven-plugin打包优势就是不需要考虑lib依赖库问题,打包完直接java -jar 包名.jar就可以运行

    3.maven-jar-plugin打包的jar需要把打包的jar和lib放在同一目录下,才能运行;但是这样打包的jar包文件大小是最小的,并且跟依赖库分离出来

    三、创建SpringCloud项目实践,Eureka注册服务中心和Eureka服务客户端实验(本人用的是Idea)

    1.打开File->Project新建一个Maven空项目myspringcloud
    在这里插入图片描述
    2.填写下面Maven项目GAV信息,继续下一步,完成创建
    在这里插入图片描述
    3.创建完后目录如下:
    在这里插入图片描述
    4.删除myspringcloud下的src目录,myspringcloud目录下右键New->Module创建一个Eureka注册服务子模块eureka-server,同上面选Maven后直接下一步,进入如下
    在这里插入图片描述
    5.同第四步操作,再次创建一个Eureka服务客户端子模块iqter-client-server
    在这里插入图片描述

    6.最终项目目录如下:
    在这里插入图片描述

    打开项目myspringcloud父模块下的pom文件和子模块eureka-server/iqter-client-server的pom文件,我们发现Idea已经在pom文件里面已经做好对应的继承关系
    父模块下的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.wyz.iqter</groupId>
        <artifactId>myspringcloud</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
    
        <!--    两个子模块信息-->
        <modules>
            <module>eureka-server</module>
            <module>iqter-client-server</module>
        </modules>
    </project>
    

    两个子模块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>myspringcloud</artifactId>
            <groupId>com.wyz.iqter</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>eureka-server</artifactId>
    </project>
    
    <?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>myspringcloud</artifactId>
            <groupId>com.wyz.iqter</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>iqter-client-server</artifactId>
    </project>
    

    7.在父模块pom配置文件引入对应的包,让项目变成SpringCloud项目,并设置对应的构建插件信息,最终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.wyz.iqter</groupId>
        <artifactId>myspringcloud</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
    
        <!--    两个子模块信息-->
        <modules>
            <module>eureka-server</module>
            <module>iqter-client-server</module>
        </modules>
    
        <!-- springboot框架相关依赖信息引用   -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.1</version>
            <relativePath/>
        </parent>
    
        <!--    属性信息设置控制-->
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>2020.0.0</spring-cloud.version>
        </properties>
    
        <!--依赖库管理-->
        <dependencyManagement>
            <dependencies>
                <!--spring cloud 相关依赖库-->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <!--    项目构建插件配置信息-->
        <build>
            <plugins>
                <!--jar打包插件-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <!-- 打包输出指定路径 -->
                        <outputDirectory>D:\deploy</outputDirectory>
                    </configuration>
                </plugin>
    
                <!-- 编译版本控制-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <encoding>utf-8</encoding>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <!--跳过测试-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <skipTests>true</skipTests>
                    </configuration>
                </plugin>
                <!--依赖库统一打包后放到指定目录-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.10</version>
                    <executions>
                        <execution>
                            <id>copy-dependencies</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>
                            <!-- 依赖库指定输出目录-->
                            <configuration>
                                <outputDirectory>D:\deploy\lib</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    8.在子模块eureka-server下src->main->java下面创建一个eureka-serve启动类EurekaServerApplication,src->main->resources下创建eureka-server配置文件application.yml,最后在自己的pom文件中引入依赖库
    在这里插入图片描述

    EurekaServerApplication类:

    package com.wyz.iqter;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }
    
    

    application.yml配置

    #本机端口
    server:
      port: 8761
    
    eureka:
      client:
        #是否向注册中心注册自己
        register-with-eureka: false
        #是否从注册中心查询服务
        fetch-registry: false
        #注册中心地址
        service-url:
          defaultZone: http://localhost:8761/eureka/
    

    pom.xml文件配置

    <?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>myspringcloud</artifactId>
            <groupId>com.wyz.iqter</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>eureka-server</artifactId>
    
        <!-- 添加注册中心依赖的包文件 -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                                <!-- 指定启动主类-->
                                <mainClass>com.wyz.EurekaApplication</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    9.运行EurekaServerApplication主类,在浏览器访问:http://localhost:8761/,出现如下说明Eureka注册服务中心启动成功:
    在这里插入图片描述
    10.接着配置Eureka客户端,使其能注册到Eureka服务注册中心去 ,在子模块iqter-client-server下src->main->java下面创建一个启动类MyClientApplication,src->main->resources下创建eureka-server配置文件application.yml,最后在自己的pom文件中引入依赖库
    MyClientApplication类

    package com.wyz.iqter;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class MyClientApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyClientApplication.class, args);
        }
    }
    
    

    application.yml

    server:
      port: 6001
    
    #当前微服务模块名称
    spring:
      application:
        name: testclient
        
    #eureka注册中心地址配置
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    

    pom.xml文件配置:

    <?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>myspringcloud</artifactId>
            <groupId>com.wyz.iqter</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>iqter-client-server</artifactId>
        <!-- 依赖库 -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                                <!-- 指定启动主类-->
                                <mainClass>com.wyz.iqter.MyClientApplication</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    10.运行MyClientApplication主类,在浏览器访问:http://localhost:8761/,出现如下说明注册到eureka成功:
    在这里插入图片描述
    11.项目都能运行正常了,进入最重要环节了,打包!因为之前pom里面都已经配置好了,所以之前在idea右侧点击maven,点击主模块myspringcloud下的package进行打包
    在这里插入图片描述
    12.根据之前pom文件里面设置的打包路径D:/deploy,进入该目录可以看到如下包和文件lib说明打包完毕
    在这里插入图片描述
    13.cmd命令【java -jar 包名.jar】下面运行起来,如果没报错,并且浏览器能正常访问就说明打包成功了
    在这里插入图片描述
    在这里插入图片描述
    遇到的坑:
    1.如果子模块pom文件没有配置指定主类,打包运行会不成功

     <!-- 指定启动主类-->
                                <mainClass>com.wyz.iqter.MyClientApplication</mainClass>
    

    2.springcloud版本之间依赖问题,最好不懂版本兼容问题,去官网:https://start.spring.io/进行查询版本依赖关系

    3.bootstrap.yml 配置文件无法生效,默认是读取application。yml配置,如果需要配置bootstrap.yml,需引入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
    </dependency>
    

    4.如果使用spring-boot-maven-plugin插件进行依赖库不分离打包,配置可以如下

                <plugin>
                    <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <outputDirectory>D:\deploy\jars</outputDirectory>
                        <classifier>exec</classifier>
    <!--                    <skip>true</skip>-->
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    
    展开全文
  • Maven profile整合Spring profile

    千次阅读 2019-03-05 16:52:00
    MavenSpring中,都有profile这个概念。profile是用于区分各种环境的,例如开发环境、测试环境、正式环境等。Maven的profile用于在打包时根据指定环境替换不同环境的配置文件配置,如数据库配置。Spring的Profile...

    在Maven和Spring中,都有profile这个概念。profile是用于区分各种环境的,例如开发环境、测试环境、正式环境等。Maven的profile用于在打包时根据指定环境替换不同环境的配置文件配置,如数据库配置。Spring的Profile可以用于在不同的环境下加载不同的bean,例如@Profile注解。两者一个是Maven编译和打包时生效,另一个是运行时生效,默认是没有关联的,本文会分别介绍非Spring Boot项目和Spring Boot项目整合Maven profile。

    Maven profile配置

    pom.xml中,可以配置testproduct两个profile,分别对应测试环境和正式环境。这里也可以根据具体情况自定义。

    <profiles>
      <profile>
        <id>test</id>
        ...
      </profile>
      <profile>
        <id>product</id>
        ...
      </profile>
    </profiles>
    

    此时,运行mvn package -Ptest就会使用id为test的profile内的配置打包,mvn package -Pproduct就是用来打正式环境包的命令。

    Spring Framework(非Spring Boot)整合Maven profile

    Spring Framework如何启用一个profile

    Spring启用某个profile有多种方式(摘自官方文档:https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/core.html#beans-definition-profiles-enable ):

    Activating a profile can be done in several ways, but the most straightforward is to do it programmatically against the Environment API which is available through an ApplicationContext.
    In addition, you can also declaratively activate profiles through the spring.profiles.active property, which may be specified through system environment variables, JVM system properties, servlet context parameters in web.xml, or even as an entry in JNDI.

    总结一下有以下几种方式:

    • 通过代码设置:ApplicationContext.getEnvironment().setActiveProfiles("yourProfile")
    • 通过系统环境变量spring.profiles.active值来设置
    • 通过JVM系统属性spring.profiles.active值来设置
    • 通过web.xml中的context-param来设置

    为了便于跟Maven整合,我们使用web.xml来设置Spring profile,如下:

    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>product</param-value>
    </context-param>
    

    以上配置会启用Spring的product profile,即正式环境。

    Spring Framework profile整合Maven profile

    如果想要整合Maven profile和Spring Framework profile,需要在Maven打包时对web.xml中的spring.profiles.active值进行替换,可以在web.xml中配置一个占位符${activeProfile}

    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>${activeProfile}</param-value>
    </context-param>
    

    pom.xml配置maven-war-plugin

    <!-- 打war包时替换占位符 -->
    <build>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.2</version>
        <configuration>
          <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
        </configuration>
      </plugin>
    </build>
    
    <!-- 默认的maven profile -->
    <properties>
      <activeProfile>dev</activeProfile>
    </properties>
    
    <profiles>
      <profile>
        <id>test</id>
        <properties>
          <activeProfile>test</activeProfile>
        </properties>
      </profile>
      <profile>
        <id>product</id>
        <properties>
          <activeProfile>product</activeProfile>
        </properties>
      </profile>
    </profiles>
    

    <filteringDeploymentDescriptors>true表示过滤Deployment Descriptor并将文件中的占位符替换为pom.xml中对应的<properties>值,Deployment Descriptor即部署描述符,指的就是web.xml (参考维基百科:https://zh.wikipedia.org/wiki/部署描述符 )。

    以上配置完成后,再通过mvn package -Ptestmvn package -Pproduct打包后,再解压war包,可以看到web.xml中原有的

    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>${activeProfile}</param-value>
    </context-param>
    

    被替换为了Maven中对应的profile,例如mvn package -Pproduct打包后web.xml内容:

    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>product</param-value>
    </context-param>
    

    以上就完成了Maven profile和Spring profile的整合。

    兼容jetty-maven-plugin

    如果恰好在项目中使用到jetty-maven-plugin用于开发环境调试,那么在web.xml配置占位符${activeProfile}后,通过mvn jetty:run启动应用时会Spring框架会报错:

    Could not resolve placeholder 'activeProfile' in string value "${activeProfile}"
    

    这是因为运行mvn jetty:run命令时插件并没有打war包,而是直接使用源码中的web.xml,此时占位符${activeProfile}未被maven-war-plugin替换,所以Spring框架会报错。

    参考文档:https://www.eclipse.org/jetty/documentation/9.4.x/jetty-maven-plugin.html#jetty-run-goal

    解决方法一

    使用mvn jetty:run-warmvn jetty:run-exploded命令替代mvn jetty:run,这两个命令会先用maven-war-plugin打好war包后再运行,此时占位符${activeProfile}已被替换为Maven的profile。

    但是这种方案会带来一个问题:由于这种方式需要先打war包再运行,开发时项目中资源(例如html、jsp)修改后就不会实时生效,而是需要重新打包启动,不便于调试。

    解决方法二(推荐)

    这种方案还是使用mvn jetty:run命令,只需要给jetty-maven-plugin插件添加一个名为activeProfile的系统属性,让Spring框架来解析web.xml中的${activeProfile}

    <plugin>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-maven-plugin</artifactId>
      <version>9.2.10.v20150310</version>
      <configuration>
        <webApp>
          <contextPath>/</contextPath>
        </webApp>
        <systemProperties>
          <systemProperty>
            <name>activeProfile</name>
            <value>${activeProfile}</value>
          </systemProperty>
        </systemProperties>
      </configuration>
    </plugin>
    

    参考文档:https://www.eclipse.org/jetty/documentation/9.4.x/jetty-maven-plugin.html#setting-system-properties

    Spring Boot整合Maven profile

    如果项目采用的框架是Spring Boot而不是直接使用Spring Framework,那么Spring Boot的profile可以在resources目录下的application.propertiesapplication.yml文件中指定,以application.properties为例:

    spring.profiles.active=product
    

    要想整合Maven profile只需要改为@activeProfile@占位符即可:

    spring.profiles.active=@activeProfile@
    

    仅需要这一行配置就完成了Spring Boot profile整合Maven profile,非常方便。此时可以尝试mvn package -Ptestmvn package -Pproduct命令打包,安装包内的文件中@activeProfile@占位符已被替换。

    Spring Boot整合Maven profile原理

    Spring Boot项目中一般都会加上spring-boot-starter-parent

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>${spring.boot.version}</version>
    </parent>
    

    可以查看spring-boot-starter-parent的pom.xml文件,里面包含maven-resources-plugin

    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
            <delimiters>
                <delimiter>${resource.delimiter}</delimiter>
            </delimiters>
            <useDefaultDelimiters>false</useDefaultDelimiters>
        </configuration>
    </plugin>
    

    ${resource.delimiter}定义的值是@

    <resource.delimiter>@</resource.delimiter>
    

    这样maven-resources-plugin插件会将application.propertiesapplication.yml文件中的@activeProfile@替换为pom.xml中对应profile的值。

    至于为什么Spring Boot要使用@..@而不是Maven默认的${..}作为占位符的符号,官方文档也给出了解释,以下摘自:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#using-boot-maven

    Note that, since the application.properties and application.yml files accept Spring style placeholders (${…​}), the Maven filtering is changed to use @…@ placeholders. (You can override that by setting a Maven property called resource.delimiter.)

    因为Spring Boot框架本身也用${..}作为占位符,Maven插件maven-resources-plugin如果还使用相同的占位符,那么可能会导致一些冲突,所以spring-boot-starter-parentmaven-resources-plugin的占位符改为@..@

    参考文档

    原文链接

    https://xxgblog.com/2016/06/01/maven-spring-profile/

    展开全文
  • [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.4.0.RELEASE:repackage (default) on project shipWireMaster: Execution default of goal org.springframework.boot:spring-...

    目录

    一, 现象

    二,分析过程

    三,解决方式


    记一个springboot打包出错的踩坑记录:

    一, 现象

    报错内容类似如下:

    [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.7.RELEASE:repackage (default) on project shipWireMaster: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.7.RELEASE:repackage failed: A required class was missing while executing org.springframework.boot:spring-boot-maven-plugin:1.5.7.RELEASE:repackge org.springframework.util.StringUtils
    [ERROR] -----------------------------------------------------
    [ERROR] realm =    plugin>org.springframework.boot:spring-boot-maven-plugin:1.5.7.RELEASE
    [ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy

    二,分析过程

    1.原先打包正常,在内网对接自动化打包需要调整pom文件,对一些组件的版本进行了升级调整,所依赖的版本且都是内网maven库已经存在的,从代码依赖来看,没有直接缺包的错误;

    2. 切换到本地老的maven仓库,打包正常,创建新仓库,依赖的jar全部从线上下载,打包存在问题,推测是是哪里不兼容。但是无法确定具体不兼容位置;

    3. 根据错误中plexus的出现,猜想是不是这个包间接有一些依赖,线上仓库的不全?将原maven库org.codehaus下的所有包都拷贝到新的仓库,打包依然出现错误;排除了plexus包下载不全的推测,真正的问题所以与直接报错提示可能关系不大,继续寻找原因。

    4. 既然推测到是哪里不兼容,再大胆一些,是不是遇到冷门bug,网上百度搜索没有看到有效的解决方案;上谷姐根据核心报错信息 org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy搜索,根据相关性排名,把前面几页的链接都打开,看到类似的报错,是maven打包插件与springBoot的兼容确实存在问题。遂修改repackage using spring-boot-maven-plugin 2.0.0;

    三,解决方式

    在pom的打包配置处,在repackage的时候,采用spring-boot-maven-plugin 2.0.0,原先项目使用的是1.5.7。重新打包,成功。

     

    参考链接:https://github.com/spring-projects/spring-boot/issues/10559

    同时发现了一位提出解决方案的大佬:https://github.com/philwebb

    展开全文
  • ...Spring Framework jdk 版本 maven 版本 1.2.0 版本之前 6 3.0 1.2.0 4.1.3+ 6 3.2+ 1.2.1 4.1.3+ 7 3.2+ 1.2.3 4.1.5+ 7 3.2+ 1.3.4 4.2.6+ 7 3.2+ 1.3.6 4.2.7+ 7 3.2+ 1.

    转自大牛 https://blog.csdn.net/wangqing84411433/article/details/90634603

    SpringBoot版本Spring Frameworkjdk 版本maven 版本
    1.2.0 版本之前63.0
    1.2.04.1.3+63.2+
    1.2.14.1.3+73.2+
    1.2.34.1.5+73.2+
    1.3.44.2.6+73.2+
    1.3.64.2.7+73.2+
    1.3.74.2.7+73.2+
    1.3.84.2.8+73.2+
    1.4.04.3.2+73.2+
    1.4.14.3.373.2+
    1.4.24.3.473.2+
    1.4.34.3.573.2+
    1.4.44.3.673.2+
    1.4.54.3.773.2+
    1.4.64.3.873.2+
    1.4.74.3.973.2+
    1.5.04.3.673.2+
    1.5.24.3.773.2+
    1.5.34.3.873.2+
    1.5.44.3.973.2+
    1.5.54.3.1073.2+
    1.5.74.3.1173.2+
    1.5.84.3.1273.2+
    1.5.94.3.1373.2+
    2.0.05.0.283.2+
    展开全文
  • IDEA报错信息:Unable to import maven project: See logs for details 根据IDEA报错信息知,需要查看日志 找到Help–>Show Log in Explorer–>找到日志 日志中的错误信息如下: 2020-03-09 16:54:12,921 [ ...
  • 在eclipse中不使用maven创建springboot工程所需jar,一共32个。亲测各包兼容,完美运行。
  • Maven3+spring3+mybatis3+dwr3+mysql5.5,请用Chrome浏览器,兼容性还未调试。 自己写的一个小系统,包含一个模块:产品模块。 基本这个模块包括的内容就比较多了,CRUD,无刷新查询,图片上传等, 其实也是整个...
  • First Idea-Maven-Spring File-new Project-Maven     next   这里显示的是idea自带的maven,选用自己的maven,配置settings.xml文件的位置,可以使用maven安装目录下的settings.xml,也可以使用本地...
  • 一起来学SpringCloud Maven版本控制

    千次阅读 2019-11-08 20:43:14
    ​ 在学习Sping Cloud之前应该先知道其与Spring Boot的对应版本,不然会出现各种不兼容的情况,和一些未知的问题。 怎么查看版本呢? 访问网站 https://start.spring.io/actuator/info 然后呢找到 spring-cloud 这...
  • Spring Secuiy 5.1 Maven依赖使用说明
  • Maven编译报不兼容类型

    千次阅读 2017-04-20 00:07:26
    Maven编译报不兼容类型,怎么办?
  • Spring Tool Suite  Spring 项目快速开发的工具集合,简称sts。 主要用于快速的开发Spring项目,我们不用再去编辑繁琐的xml配置文件,而是由工具自动生成。...3.STS4 下载链接http://spring.io...
  • 使用gradle辅助解析spring boot启动机制1. 概述2. gradle简述 1. 概述 最近在心血来潮,想研究下除了maven之外的部署及依赖管理框架,这就接触到了gradle。在研究gradle配置及部署的同时,发现gradle具备可定制的...
  • 1. 后台架构:SpringMVC 5.1.5、Spring 5.1.5、SpringSecurity 5.1.4、Hibernate 5.3.7 2. 前端架构:Bootstrap,兼容JQuery,AJAX 3. 页面设计:SmartAdmin,AJAX + 对话框操作风格,可换6种页面风格和颜色 4. ...
  • 在创建Maven项目或者SpringBoot项目... maven版本与idea版本存在兼容性问题,版本不兼容就会报无法导入maven项目的问题。 Unable to import maven project: See logs for details IDEA2018版本只兼容Maven3.6...
  • 总结解决maven版本兼容方法

    千次阅读 2017-01-10 15:47:15
    在实际的开发中,不管是maven构建项目,还是使用spring boot为微服务框架的项目,我们会遇到遇到版本兼容问题,如果版本选择不对,最直观的表现是无法找到这个类或者这个功能失效,现在结合自己在开发中遇到的版本...
  • maven-查看引入jar兼容情况

    千次阅读 2017-05-03 16:00:51
    在mvnrepository中引入一个的时候先看看他的依赖: 根据依赖的情况来判断版本的兼容问题。 ...Maven通过nexus下载的包中可以看到对jdk的兼容问题,比如cxf: 可以看出它是兼容到jdk1.8的:
  • 因为一些特殊的原因,需要使用一些本地的jar进行依赖,加载外部jar后编码过程中没有任何问题,但是打包时一直报“程序不存在”。 问题描述: 思考一下:Maven本质上是一个插件框架,它的核心并不执行任何具体的...
  • idea2020.1使用maven3.6.3时导入spring依赖会报错 程序org.springframework.beans.factory不存在 在使用idea202.1导入spring的依赖时,报错找不到 org.springframework.beans.factory不存在,换回2019.3版本就没这...
  • 关于Stringboot maven项目 出现org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration) 问题的解决。网上各路操作都...
  • JDK1.8/Mysql5.7/Maven3/Tomcat8.0/Eclipse Neon. 注意事项: 1、按照以下语法建立数据库(ProjectName为你的数据库名,可以改你自己想要的名字,改完请记得把项目中的数据库连接配置也改好) CREATE DATABASE ...
  • [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.7.RELEASE:repackage (repackage) on project demo: Execution repackage of goal org.springframework.boot:spring-boot-...
  • dubbox兼容spring4.x

    2017-12-18 16:19:24
    1、准备工作  下载dubbox的源代码  ...修改dubbox的父工程,在pom文件中找到,spring.bom.version将spring由 3.2.8-RELEASE修改为4.2.4.RELEASE(主要是适配自己spring的版本) 将dubbo-rpc-http工程的Ht
  • 使用dependencyManagement和io.spring.platform管理Maven项目依赖及版本问题1.io.spring.platform: 在spring的使用过程中,通常要依赖许多第三方库,其中某些依赖版本之间可能会出现不兼容问题,(比如说,Spring4...
  • 管理工具:Maven 最开始引入的测试是org.junit.test,属于JUnit4,工程package时会自动执行单元测试,后来了解到JUnit5一些很好的特性,打算用JUnit5替代JUnit4。SpringBoot 2.2.5提供了两套API,既有JUnit4也有...
  • 问题原因:maven的插件版本的问题,造成与IDE的不兼容。 解决办法:在properties中加入maven的版本插件。 <maven-jar-plugin.version>3.0.0</maven-jar-plugin.version> 保存pom.xmL文件即可去掉红X...
  • 二、pom.xml 我这里使用到的版本如下: groupId artifactId version org.springframework.boot spring-boot-maven-plugin 2.3.12.RELEASE org.apache.maven.plugins maven-compiler-plugin 3.8.1 org.apache.maven....
  • spring boot的maven配置依赖

    千次阅读 2017-08-20 13:33:25
    可以实现web项目的功能,当然不使用spring-boot-start-web,通过自己添加的依赖也可以实现,但是需要一个个添加,费时费力,而且可能产生版本依赖冲突。我们来看下springboot的依赖配置: 利用p...
  • 作者 :乐百川转载自:toutiao.com/i6824937779193971207相信使用Java的同学都用过Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用Ma...
  • 项目升级micro server。在spring boot框架下使用comet4j实现了服务端向前端web页面的主动信息推送。运行环境tomcat7。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,362
精华内容 8,144
关键字:

maven包兼容spring4

spring 订阅