【问题标题】:VSCode, Java, Spring Boot and Maven - Environment variables not being readVSCode、Java、Spring Boot 和 Maven - 未读取环境变量
【发布时间】:2020-01-18 18:08:09
【问题描述】:

注意事项

请参阅下面问题的编辑部分,因为进一步调查已使该问题的大部分内容变得多余。


类似于this question,在使用 VSCode 时,我似乎无法在启动时将环境变量传递给我的应用程序。问题是,我不知道是什么(或是否有)扩展导致了问题。

我有带有以下扩展的 VSCode 1.38.1;

  • Java 0.48.0 的语言支持
  • Java 扩展包 0.8.0
  • Maven for Java 0.18.2
  • Spring Boot 仪表板 0.1.6
  • Spring Boot 工具 1.10.0
  • 还有其他几个我认为不是罪魁祸首的人。

我想做的是使用 maven 配置文件有条件地引入依赖项,并使用环境变量来触发它。在我的 pom.xml 中,我有;

<profiles>
    <profile>
        <id>dev-mysql</id>
        <activation>
            <!-- activate if system properties 'env=dev-mysql' passed in on launch.json env property from VSCode -->
            <!-- Following does not work :( -->
            <property>
                <name>env</name>
                <value>dev-mysql</value>
            </property>
            <!-- Obtain the following info by running - mvn enforcer:display-info -->
            <!-- <os>
                <name>windows 7</name>
                <family>windows</family>
                <arch>amd64</arch>
                <version>6.1</version>
            </os> -->
        </activation>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.17</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>

我尝试通过类似的方式在 launch.json 中设置 env 值;

    {
      "type": "java",
      "name": "Debug (Launch)-MyServiceApplication<my-service>",
      "request": "launch",
      "mainClass": "myapp.MyServiceApplication",
      "projectName": "my-service",
      "vmArgs": "-Dspring.profiles.active=local-mysql",
      "env": {
        "env": "dev-mysql"
      }
    }

我还尝试通过 settings.json 添加 maven customEnv,因为 Maven for Java 扩展似乎暗示“...这些环境变量值将被添加到终端会话 before Maven首先执行”。我的 settings.json 文件看起来像;

{
  "java.configuration.updateBuildConfiguration": "automatic",
  "files.exclude": {
    "**/.classpath": true,
    "**/.project": true,
    "**/.settings": true,
    "**/.factorypath": true
  },
  "maven.terminal.customEnv": [
    {
      "environmentVariable": "env",
      "value": "dev-mysql"
    }
  ]
} 

我通过按 F5 来执行我的应用程序,据我了解,它执行上面 launch.json sn-p 中显示的内容。我不太明白这里是如何调用 maven 的。但是,无论如何,它似乎永远找不到环境变量,因此包含配置文件特定的 mysql 依赖项。即使我使用 Spring Boot Dashboard,我也会得到相同的结果;无法识别 mysql 依赖项,所以我最终得到 Cannot load driver class: com.mysql.cj.jdbc.Driver

如果我注释掉 pom.xml 的 &lt;property&gt; 元素并取消注释 &lt;os&gt; 元素,那么它确实引入了配置文件特定的 mysql 依赖项。所以我猜它正确使用了pom文件。

有没有人知道如何设置环境变量以便通过此配置识别它们?此外,有关当我使用此设置(是 maven 还是 Java)点击 F5 时实际执行的内容的任何进一步信息,将不胜感激。

编辑:

一些进一步的调查表明我是"...confusing Environment Variables with System Properties"Wouter Lievens 的评论

This post 还建议“您不能根据构建计划开始执行后定义的系统属性激活配置文件”,这很可能是我刚刚按 F5 执行我的应用程序时发生的情况。这还链接到 this answer 中的一些进一步信息,其中阐明了 if 不起作用,因为“......配置文件是在确定有效 POM 之前评估的第一件事。”。

我的解决方法是不使用 F5,而是设置 spring-profiles-active=local-mysql 后,我必须使用 Maven for Java Explorer 来执行 spring-boot:run -Pdev-mysql 的自定义目标

所以我的最后一个问题是;

考虑到我添加到 VSCode 的扩展以及上面的 launch.json,当我使用这个设置点击 F5 时实际执行的是什么 - 是 Maven、Java 还是其他什么?如果是 Java,pom.xml 是如何发挥作用的?如果是Java,有没有办法调整launch.json改用mvn

当我按下 F5 以更好地了解实际执行的内容时,有没有办法提高日志记录的详细程度?

【问题讨论】:

  • 你的意思是你不能得到你在launch.json中设置的env值吗?
  • 是的@LeoZhu-MSFT,这是正确的。我的理解是 pom.xml 中的配置文件应该选择“属性”部分下指定的环境变量。如果将其设置为 dev-mysql,则该 spring 配置文件下的依赖项应该被拉入。
  • 是否需要通过 Maven 在 SpringBoot 中配置活动配置文件?我不太了解。this 有帮助吗?
  • @LeoZhu-MSFT,感谢您的建议。它可能会提供一些激活配置文件的替代方法,但并不是我所追求的。我不得不编辑我的问题,因为进一步调查意味着我对事物的理解不正确,因此对行为的期望不切实际。我仍然发现所有的扩展都会添加到 VSCode 中,但有时我对如何协同工作以运行应用程序感到有些困惑,因此将其作为这个问题的重点。

标签: java maven spring-boot visual-studio-code


【解决方案1】:

在运行 vscode 驱动测试时,将环境变量放在 settings.json 而不是 launch.json 对我有用:

{
    "java.configuration.updateBuildConfiguration": "automatic",
    "java.test.config": [
        {
            "workingDirectory": "${workspaceFolder}",
            "env": {
                "STAGE_ENV": "DEV",
                "AWS_REGION": "us-west-2"
            }
       }
    ]
}

然而:ma​​ven 测试不会从中读取。我可以通过在这个位置的 pom 中添加变量来运行 maven 测试:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
            </plugin>
            <plugin>
                <!-- run unit tests -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <environmentVariables>
                      <!-- add them here -->
                        <STAGE_ENV>DEV</AWS_ACCESS_KEY>
                        <AWS_REGION>us-west-2</AWS_REGION>
                      <!-- -->
                    </environmentVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>

我还没有找到一个好的解决方案来使用单个 .env 文件来支持这两种情况。

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 2020-05-05
    • 2018-04-12
    • 2019-08-03
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多