当前位置: 首页 > 知识库问答 >
问题:

VSCode、Java、Spring Boot和Maven—未读取环境变量

袁亦
2023-03-14

注意井

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

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

我有VSCode 1.38.1与以下扩展;

  • Java 0.48.0的语言支持
  • Java扩展包0.8.0
  • Maven for Java 0.18.2
  • Spring靴仪表板0.1.6
  • Spring Boot Tools 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>

我尝试通过以下方式将该env值设置为launch.json;

    {
      "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"
      }
    }

我还尝试通过设置添加maven customEnv。作为Maven for Java扩展的json似乎表明“……这些环境变量值将在第一次执行Maven之前添加到终端会话”。我的设置。json文件看起来像;

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

我通过点击F5来执行我的应用程序,据我所知,F5会执行启动中显示的内容。上面的json片段。我不太明白这里是如何调用maven的。然而,无论如何,它似乎永远都找不到环境变量,因此包含特定于配置文件的mysql依赖项。即使我使用Spring Boot Dashboard,我也会得到同样的结果;mysql依赖项无法识别,因此我最终无法加载驱动程序类:com.mysql。希杰。jdbc。驱动程序

如果我把

有没有人知道如何设置环境变量,以便通过这种配置识别它们?另外,如果我用这个设置点击F5(是maven,是Java)时,能提供更多关于实际执行内容的信息,我们将不胜感激。

编辑:

一些进一步的调查表明,我是“...混淆环境变量和系统属性”的评论。

这篇文章还建议,“你不能根据构建计划开始执行后定义的系统属性激活配置文件”,这很可能是我刚点击F5执行应用程序时发生的情况。这还链接到本答案中的一些进一步信息,其中澄清了if不起作用,因为“……在确定有效POM之前,首先要评估配置文件。”。

我的解决方法是不使用F5,而是,当我设置了sping-filaces-active=local-mysql时,我必须使用Maven forJavaExplorer来执行自定义的sping-start目标:run-Pdev-mysql

所以我最后的问题是;

考虑到我在VSCode中添加的扩展以及上述发布。json,当我用这个设置点击F5时,实际执行的是什么?是Maven、Java还是其他什么?如果是Java,pom是如何实现的。xml发挥作用了吗?如果是Java,有没有调整发布的方法。json是否改为使用mvn

当我点击F5时,有没有办法提高日志记录的冗长程度,以便更好地理解实际正在执行的内容?


共有1个答案

柴彬
2023-03-14

在运行vscode驱动的测试时,将环境变量放入设置中。json而不是launch。json对我有用:

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

然而:maven测试并没有从中解读。我可以通过在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文件来支持这两种情况。

 类似资料:
  • 在SpringBoot中读取环境变量的最佳方法是什么? 在Java中,我使用了以下方法: 是否可以使用注释来实现?

  • 在Jenkins中,我试图设置一个动态环境变量。 我使用Scriptler创建了一个Groovy脚本并将结果写入文件。 然后,我使用EnvInject来读取该文件的内容。 Groovy脚本: 设置: 但是,我想要设置的环境变量仍然无法识别: 知道为什么无法识别环境变量吗?

  • 一个朋友让我为他们做一个minecraft插件,所以我需要安装Maven。我已经按照教程的指示安装了以下用户变量。 > java_home--值:C:\program files\java\jdk1.8.0\bin windows 7 maven 2安装 当我尝试在命令Propmpt中设置它时,它会响应我,说。如何成功运行? 谢谢你的阅读。 另外,这是我的系统路径变量值:有什么问题吗?

  • 5.3.1 $%envVarName% 当编译时,$%envVarName% 将会被环境变量 envVarName 替换。

  • 问题内容: 有没有办法在Node.js代码中读取环境变量? 例如Python的。 问题答案: process.env.ENV_VARIABLE 您要访问的变量的名称在哪里。

  • 问题内容: 对于Windows 7,我已经安装了32位和64位版本的JDK。所有四个安装的版本均为8,更新为20。 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 当我下载并解压缩elasticsearch并运行/bin/service.bat或/bin/elasticsearc