Bootstrap

Java - Maven编译打包项目报错:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:

在使用Maven打包时报错如下:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources (default-resources) on project center-sentinel: filtering D:\xx\center-sentinel\src\main\resources\application.properties to D:\xx\center-sentinel\target\classes\application.properties failed with MalformedInputException: Input length = 1 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :center-sentinel

报错信息提示的是Maven在打包(packaging)过程中,在处理src/main/resources目录下的xx.properties文件时出现了问题。具体来说,是filtering过程出现了问题,意味着Maven正在尝试使用配置的过滤器(如变量替换)来处理这个资源文件。

解决方法通常包括以下几个步骤:

1、检查Maven配置:确保pom.xml文件中配置的资源过滤(<build>/<resources>)正确无误。

2、检查文件路径:确认xx.properties文件的路径是否正确,是否确实位于src/main/resources目录下。

3、检查过滤器配置:如果你使用了自定义的过滤器,确保它们被正确配置,并且所有需要替换的属性都是可用的。

4、清理目标目录:尝试运行mvn clean来清理之前的构建结果,然后再次执行打包命令。

5、查看详细错误信息:如果上述步骤不能解决问题,可以尝试使用mvn -X来运行Maven,这样可以提供更详细的错误输出信息,以便进一步诊断问题。

6、检查文件编码:确保xx.properties文件的编码格式与Maven的处理编码格式一致,通常是UTF-8

7、查看Maven版本和插件:确保你使用的Maven版本和相关插件是最新的,或者至少是与你的项目兼容的版本。

先说一下我这边的springboot-parent项目中pom.xml文件配置:

<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 引入所有 匹配文件进行过滤 -->
                <includes>
                    <include>application*</include>
                    <include>bootstrap*</include>
                    <include>logback*</include>
                <!-- filtering 是用来声明 是否开启配置文件的变量替换规则。默认为false,
                    只有在一个公共配置文件+多个环境变量替换配置文件方式下才有效,
                    如果是我这种在不同环境的文件夹名称下各有各的公共配置文件的话,是完全不需要管                          
                这个参数的 -->
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

MAVEN提供了一种过滤机制,这种机制能够在资源文件被复制到目标目录的同时,当filtering = true时替换资源文件中的占位符;当filtering = false时不进行占位符的替换

filtering 是用来声明 是否开启配置文件的变量替换规则。默认为false,只有在一个公共配置文件+多个环境变量替换配置文件方式下才有效,如果是我这种在不同环境的文件夹名称下各有各的公共配置文件的话,是完全不需要管这个参数的 

  • 如果果启用了过滤,确保你的 properties 文件没有包含不合法的 Unicode 字符。
  • 如果有,可能需要手动修复这些字符或禁用过滤。

经过一番分析和排查发现,最终发现是由于src\main\resources目录下application.properties配置文件的字符存在不合法的UniCode字符导致的,如下:

将 src\main\resources目录下application.properties配置文件中不合法字符去除即可!

当然,也可以将filtering设置false关掉,打包直接可以成功,但是这边使用的Nacos远程配置,发现打包上传之后,启动服务直接报错:

是因为资源文件中的占位符@profiles.active@不能被替换为实际的参数值导致! 

;