加载概要文件上定义的Maven依赖项



我正在用2种不同的情况构建一个演示应用程序,第一种是开发,第二种是生产。这是我的pom。xml

... (version, name, etc)
<properties>
<java.version>11</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--DEFAULT PROFILE-->
<env>development</env>
</properties>
<dependencies>
... (lombok, junit, swagger, datarest, datatest, web, webmvc...)
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<filters>
<filter>src/main/resources/${env}.yml</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.yml</include>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<start-class>com.central.CentralApplication</start-class>
<env>development</env>
</properties>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
</profile>
<profile>
<id>production</id>
<activation>
<property>
<name>production</name>
</property>
</activation>
<properties>
<env>production</env>
<start-class>com.central.CentralApplicationProd</start-class>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-client</artifactId>
<version>3.0.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
</project>

在pom中似乎没有问题,但是当我尝试创建用于生产目的所需的main时,它找不到Eureka和Feign依赖项(@EnableEurekaClient和@EnableFeignClients)。另一方面,如果我更改<activeByDefault>true</activeByDefault>并将其放在生产配置文件中,它会加载其依赖项,但显然不会加载开发依赖项。

如何在编码时加载这两个依赖项?我的方法错了吗?

提前感谢!

如果你有一个spring引导应用程序,你不应该为任何依赖定义任何配置文件。

如果你需要对dev和prod有不同的配置,你应该使用spring配置文件。这意味着您可以定义像application.properties(也适用于.yml)或application-dev.properties这样的文件,它们可以简单地通过--spring.profiels.active=dev激活,这意味着激活application-dev.properties

此外,如果您只需要用于测试的h2数据库,您应该简单地使用<scope>test</scope>代替。

看起来很奇怪,你在prod配置文件中定义了spring-boot-starter-actuator依赖项,但没有为dev定义。

另一件事是,你已经定义了<start-class>com.central.CentralApplication</start-class>,默认情况下,它是通过包含@SpringBootApplication注释的类定义的。这意味着你只有一个类来实现这个目的,不管在哪个环境等等。

我强烈建议阅读spring引导文档等。问题是为什么不同时定义两者呢?

我还看到您在spring-boot-maven-plugin配置中显式地排除了lombok。这通常意味着您没有正确定义lombok的依赖范围。

最佳实践是而不是如果使用bom导入,请自己定义依赖项的版本,否则可能会出现版本混合,从而导致问题。

最后一个建议是永远不要使用配置文件来使用不同的依赖项。

https://docs.spring.io/spring-boot/docs/current/reference/html/

您应该将共享依赖项放在pom文件主部分的概要文件标记之外。代码中的Java类需要这种依赖关系。

如果您想在不同的环境中实现不同的逻辑,我建议您在Spring配置文件中使用不同的配置文件。

最新更新