如何在Maven构建中禁用Spring Cloud Kubernetes

hc2pp10m  于 2022-11-28  发布在  Spring
关注(0)|答案(3)|浏览(268)

正在运行Sping Boot 2.6.6和Spring Cloud 2021.0.1
我试图将一个现有的服务迁移到Kubernetes,所以我添加了一个对spring-cloud-starter-kubernetes-client-all的依赖关系。默认情况下,我有spring.cloud.kubernetes.enable=false,并使用kubernetes配置文件来启用它。这是为了允许此服务在Kubernetes和遗留环境中运行。
我的单元测试在本地构建时成功完成,但在Bitbucket管道中失败,并出现以下错误:

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.cloud.kubernetes.commons.config.NamespaceResolutionFailedException: unresolved namespace

我怀疑发生这种情况是因为Bitbucket管道部署在Kubernetes中,Spring不知何故检测到了这一点。

  • 在命令行上将--define SPRING_CLOUD_KUBERNETES_ENABLED=false传递给Maven
  • 将其设置为环境变量,例如export SPRING_CLOUD_KUBERNETES_ENABLED=false
  • 在命令行上将--define spring.cloud.kubernetes.enabled=false传递给Maven

我也检查了StackOverflow的类似问题,并调查了代码,也没有结果。实际上引发问题的类是KubernetesClientConfigUtils,应该禁用它。
如果您能提供任何指导,我将不胜感激。

bd1hkmkf

bd1hkmkf1#

Spring Cloud会在加载激活的Spring配置文件配置之前检查应用程序是否在K8s环境中运行,并将kubernetes添加到激活的配置文件中。以前,在霍克斯顿SR 10中,配置文件会在检查Kubernetes之前被识别并加载bootstrap-<profile>.yml。如果在配置文件配置或maven pom属性中设置了spring.cloud.kubernetes.enabled,则会从那里获取spring.cloud.kubernetes.enabled
由于maven允许在命令行上设置系统属性,因此可以通过在命令行上设置来禁用kubernetes检测:

mvn test -Dspring.cloud.kubernetes.enabled=false

surefire maven插件允许为所有测试设置系统属性,因此可以在surefire插件配置中将spring.cloud.kubernetes.enabled设置为false

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <systemPropertyVariables>
            <spring.cloud.kubernetes.enabled>false</spring.cloud.kubernetes.enabled>
        </systemPropertyVariables>
    </configuration>
</plugin>

还可以使用@Faron的方法在单个测试类上设置配置,以显式设置任何WebMvcTest注解单元测试中的属性,例如:

@WebMvcTest(properties = { "spring.cloud.kubernetes.enabled=false" })

它也应该可以用于其他加载Spring应用程序上下文的单元测试注解,例如WebFluxTest

0lvr5msh

0lvr5msh2#

在尝试了其他几种方法之后,我终于偶然发现了一种有效的方法。

@WebMvcTest(properties = { "spring.cloud.kubernetes.enabled=false" })

这也适用于加载Spring应用程序上下文(如@WebFluxTest)的任何单元测试注解

8yparm6h

8yparm6h3#

升级到Sping Boot 2.7.x和Spring Cloud 2021.x后,我也遇到了这个问题:

NamespaceResolutionFailedException: unresolved namespace

我的解决方案是在test resources文件夹中添加一个bootstrap.yml文件,如下所示:

spring:
  cloud:
    compatibility-verifier.enabled: false
    kubernetes:
      enabled: false
      reload.enabled: false
      discovery.enabled: false

(如果application.yml中有此文件,请将其删除)
来自文档:
https://www.baeldung.com/spring-cloud-bootstrap-properties
https://github.com/spring-cloud/spring-cloud-kubernetes/issues?q=unresolved+namespace

相关问题