Maven 跑 Spring Boot 常用命令 + 依赖解析失败排查

Spring Boot 项目用 Maven 跑,其实就三个常用命令。但组合起来 + 遇到依赖冲突时坑不少。

三个常用命令

开发时启动

mvn spring-boot:run

看到 Started XxxApplication in x.xxx seconds 就通了。

跳过测试加速启动

mvn spring-boot:run -DskipTests

老项目测试跑几分钟是常态,开发时基本都会跳。

指定环境

mvn spring-boot:run -Dspring-boot.run.profiles=dev

application-dev.yml 里的配置。多环境就用这个切。

打包 + 运行

生产部署更常用两步走:

mvn clean package -DskipTests
java -jar target/*.jar

产物是 fat jar(Spring Boot 把依赖都塞里面),直接 java -jar 起就行。加参数:

java -jar target/myapp.jar \
     --spring.profiles.active=prod \
     --server.port=8081

后台跑用 nohup

nohup java -jar target/myapp.jar > app.log 2>&1 &

生产建议走 systemd 或 Docker,不是裸 nohup

常见问题

1. mvn 不是内部或外部命令

PATH 没配好。先确认:

mvn -v

不通就照 Windows 追加目录到 PATH 里的方法把 MAVEN_HOME\bin 加进去。改完 新开一个终端 或注销重登。

2. No plugin found for prefix 'spring-boot'

pom.xml 里没引 Spring Boot 插件。加:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

spring-boot-starter-parent 已经管好版本,不用写 version。没继承 parent 的话就得写。

3. 端口占用

Web server failed to start. Port 8080 was already in use.

先查是谁:

netstat -ano | findstr 8080     # Windows
lsof -i:8080                    # Linux/Mac

杀掉:

taskkill /PID 12345 /F

或者改端口:

server:
  port: 8081

4. artifact ${revision} not found

碰到这种:

Could not find artifact net.maku:maku-boot:pom:${revision} in public

问题不在 Maven 仓库、不在网络。是这个项目用了 Maven 的 CI Friendly Versions 特性——pom.xml 里的版本号写成 ${revision}

<version>${revision}</version>

需要在根 pom.xml 里定义:

<properties>
    <revision>4.11.0</revision>
</properties>

或者启动时传:

mvn spring-boot:run -Drevision=4.11.0

推荐:用 flatten-maven-plugin 生成扁平化的 pom:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>flatten-maven-plugin</artifactId>
  <version>1.6.0</version>
  <configuration>
    <flattenMode>resolveCiFriendliesOnly</flattenMode>
  </configuration>
  <executions>
    <execution>
      <id>flatten</id>
      <phase>process-resources</phase>
      <goals><goal>flatten</goal></goals>
    </execution>
    <execution>
      <id>flatten.clean</id>
      <phase>clean</phase>
      <goals><goal>clean</goal></goals>
    </execution>
  </executions>
</plugin>

之后 mvn install 会先把 ${revision} 替换成真实版本再安装到本地库,其它模块拉的时候就不会崩了。

5. 依赖下载慢

Maven 默认仓库在国外,换阿里云或华为云:

~/.m2/settings.xml

<settings>
  <mirrors>
    <mirror>
      <id>aliyun</id>
      <mirrorOf>central</mirrorOf>
      <url>https://maven.aliyun.com/repository/central</url>
    </mirror>
  </mirrors>
</settings>

一次配好,永久生效。

6. 开发热重载

Spring Boot 自带 devtools:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>

IDEA 里要开 “Build project automatically” + “Registry: compiler.automake.allow.when.app.running”,代码保存自动 recompile + restart。

一句话总结

开发用 mvn spring-boot:run -DskipTests、生产用 mvn clean package + java -jar${revision} 报错是 CI Friendly Versions,加 flatten 插件解决。