在使用 Visual Studio 代码调试 spring 引导应用程序时,如何指定要使用的 Maven 配置文件名称?

How do I specify the maven profile name to use when debugging a spring boot app with Visual Studio Code?

这很可能是 this question 的重复,但那里的答案不起作用。

在我的 POM 文件中,我定义了几个类似这样的配置文件:

<profiles>
    <profile>
        <id>dev</id>
        <properties> 
            <activated-profile>dev</activated-profile>
        </properties>
    </profile>
    ...
</profiles>

activated-profile 是 属性 在 application.properties 文件中用来告诉 spring 引导使用什么配置文件:

...
spring.profiles.active=@activated-profile@
...

如果我在cmd提示中运行mvn clean install package spring-boot:repackage -Pdev,我可以在cmd提示中看到windowThe following profiles are active: dev,说明正确的配置文件处于活动状态。

如果我尝试从 Visual Studio 代码启动和调试应用程序,在终端中我得到 The following profiles are active: @activated-profile@.

我尝试在 launch.json 中设置参数:

{
    ...
    "args": ["activated-profile=dev"],
    "vmArgs": ["Dactivated-profile=dev"],
    ...
}

我还尝试在 settings.json 中为 maven 设置自定义环境变量,以及问题中的答案,您肯定会告诉我我重复了:

{
    ...
    "maven.executable.options": "-Pdev",    
    "maven.terminal.customEnv": [{
        "environmentVariable": "activated-profile", "value": "dev" 
    }],
    ...
}

我还尝试在 activated-profile 前面加上 ---D-D--D,以及重命名 activated-profileactivatedprofile 以防连字符以某种方式搞砸。

没有任何效果。

让 VS Code 开始调试的唯一方法是在 POM 文件中指定默认配置文件:

<activation>
    <activeByDefault>true</activeByDefault>
</activation>

然而,这并不理想,因为每次我想用不同的配置文件构建应用程序时,我都必须删除那段代码,因为 maven 以其无限的智慧决定在我指定它时不覆盖该配置文件在命令行中,渲染 -Pdev-Pint 无用。换句话说,如果我希望 Jenkins 能够构建应用程序,POM 中不应存在 activeByDefault XML。

以下解决方案假定您已经安装了 Java 扩展包

如果没有,请继续安装然后继续阅读(Link to install Java Extension Pack)

在您的 launch.json 配置中(运行 - > 打开Configurations)需要使用vmArgs如下:

{
"version": "0.2.0",
"configurations": [
    {
        "type": "java",
        "name": "Launch MyApp",
        "request": "launch",
        "mainClass": "com.example.MySpringApplication",
        "projectName": "myproject",
        "vmArgs": " -Dspring.profiles.active=dev"
    }
 ]
}

您可以(当然)同时使用多个配置文件,例如,如果您已经将 Spring 安全配置分离到不同的文件中(例如 devsec-application.yaml):

"vmArgs": " -Dspring.profiles.active=dev,devsec"