如何配置CLASSPATH指向Maven仓库?含Docker打包疑问
命令行运行带依赖的Maven项目
方法1:用Maven Exec插件直接运行
无需手动拼接类路径,Maven会自动加载~/.m2/repository中的依赖,直接执行:
mvn exec:java -Dexec.mainClass="App"
如果主类包含包名(如com.example.App),替换参数为-Dexec.mainClass="com.example.App"即可。
方法2:打包成包含所有依赖的可执行Jar(Fat Jar)
打包后可直接用java -jar运行,无需依赖外部文件。推荐使用maven-assembly-plugin,在pom.xml中添加以下配置:
<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>App</mainClass> <!-- 替换为你的主类全限定名 --> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
执行mvn package后,target目录会生成类似my-app-1.0-SNAPSHOT-jar-with-dependencies.jar的文件,运行命令:
java -jar target/my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
打包为Docker镜像
基于Fat Jar的Docker镜像制作(推荐)
步骤如下:
- 按上述方法打包好Fat Jar
- 在项目根目录创建
Dockerfile:
# 使用对应版本的OpenJDK基础镜像 FROM openjdk:17-jdk-slim # 设置容器内工作目录 WORKDIR /app # 复制Fat Jar到容器内 COPY target/my-app-1.0-SNAPSHOT-jar-with-dependencies.jar app.jar # 容器启动时运行程序 CMD ["java", "-jar", "app.jar"]
- 构建Docker镜像:
docker build -t my-app:1.0 .
- 运行容器:
docker run --rm my-app:1.0
不打Fat Jar的Docker镜像制作(可选)
若不想打包Fat Jar,可在镜像中复制依赖和项目Jar,手动设置类路径:
- 先导出Maven依赖到本地目录:
mvn dependency:copy-dependencies -DoutputDirectory=target/dependency
- 创建
Dockerfile:
FROM openjdk:17-jdk-slim WORKDIR /app # 复制依赖目录和项目Jar COPY target/dependency /app/dependency COPY target/my-app-1.0-SNAPSHOT.jar app.jar # 设置类路径并运行主类 CMD ["java", "-cp", "app.jar:dependency/*", "App"]
- 构建、运行镜像的命令与上述一致。
内容的提问来源于stack exchange,提问作者YoavKlein
相关产品推荐
相关产品推荐

