如何直接运行build文件夹内的class文件启动gradle项目
Gradle 无源码使用已有build目录运行项目方案
能否直接跳过build生成步骤运行已有build目录?
默认的./gradlew run任务内置了compileJava、processResources等构建任务的依赖,会先校验源码和构建产物的增量状态:
- 如果本地有完整源码、且现有build目录产物和源码匹配没有变更,Gradle会自动标记构建任务为UP-TO-DATE,不会重新生成build目录内容,直接运行现有产物。
- 如果是单独把build目录拷贝到无源码的服务器环境,默认的
run任务无法直接执行,因为缺少源码无法完成项目加载和增量校验逻辑。
无源码使用已有构建产物启动的方案
方案1:使用可执行Jar部署(最推荐)
这是无源码部署的标准方案,不需要服务器安装Gradle环境:
- 本地开发环境执行
./gradlew build后,从build/libs目录取出打包好的可执行Jar:- 用Spring Boot插件开发的项目会直接生成自带所有依赖的可执行Jar
- 用Gradle Application插件的项目可以执行
./gradlew jar或者./gradlew assemble生成可执行Jar
- 把Jar包上传到服务器,直接执行
java -jar 你的Jar包名.jar即可启动。
方案2:直接使用现有class、资源和依赖Jar启动
如果不想打包,要直接使用build目录内的零散产物,可以用以下两种方式:
方式A:直接执行Java命令(不需要Gradle)
把所有产物路径加入classpath,指定主类运行即可,命令示例:
# Linux/macOS 环境 java -cp "build/classes/java/main:build/resources/main:build/libs/*" 你的主类全限定名 # Windows 环境,把冒号替换为分号 java -cp "build/classes/java/main;build/resources/main;build/libs/*" 你的主类全限定名
方式B:自定义Gradle任务跳过构建逻辑
如果需要通过Gradle命令启动,可以在服务器上放一个极简的build.gradle配置文件,自定义不依赖构建任务的执行任务:
plugins { id 'java' } task runWithoutBuild(type: JavaExec) { // 替换为你项目的主类全限定名 mainClass = 'com.example.你的主类名' // 直接指定已有build目录内的产物路径作为classpath classpath = files( 'build/classes/java/main', 'build/resources/main', fileTree('build/libs').include('*.jar') ) }
上传build目录和这个配置文件到服务器后,执行./gradlew runWithoutBuild即可直接运行,不会触发任何构建相关任务。
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

