Java命令行运行找不到主类问题

问题描述

最近项目里抽象的发现Java代码在点击IDEA的运行按钮可以运行,但是通过命令行启动就不行,报错找不到主类,md控制台可以成功,但是java函数里不行,出现类找不到的问题,很奇怪,遂寻找一下解决办法
image.png
直接IDEA里面点击运行是能够跑的,然后使用命令行去泡就不行,不合理。

解决过程

恍然间意识到可能是编译系统的问题,在IDEA里面新建项目,在编译系统选择的时候会有三个选项,IntelliJ, Maven, Gradle
image.png
前面项目是选择的Gradle。

于是尝试不用这么复杂的项目,新建了两个最简单的代码输出Hello World,一个选择Gradle,一个是IntelliJ,然后使用命令行去运行一下,果然前者不行,后者可以。
3f27a0d85cd0df93c1e8268a0773a72.png
坑点一
找到问题了,使用Gradle编译的话,在用命令行执行的时候是需要指定类路径的,也就是需要java -cp 去指定。此外要运行的代码也需要指定完全的包名,如org.example.Main
坑点二
接下来是遇到缺少依赖的问题,注意往-cp后面的路径里添加即可,注意windows的分隔符号是;linux的是:
另外需要注意的是,命令行运行的时候,可能还是会报错缺少某某类,这个就是缺少依赖包的问题,
原因可能是IDEA自带的Build按钮编译后,结果文件夹build/下面会少一些运行所需要的依赖包(应该是它自动设置了),可以去build/文件夹里找找看看有没有,可以选择解压libs下面的jar文件,看看所需要的依赖是不是齐全。
坑点三
如果不齐全的话,那就需要自行手动编译./gradlew build
改动build.gradle文件,自定义编译,把依赖包都包括起来,添加如下字段。

jar {
    destinationDir file('dist/apps')
    archiveName project.name + '.jar'
    exclude '**/*.xml'
    exclude '**/*.properties'
    exclude '**/*.crt'
    exclude '**/*.key'
    exclude '**/*.txt'
    exclude '**/*.toml'
    exclude '**/*.json'

    doLast {
        copy {
            from configurations.runtimeClasspath
            into 'dist/lib'
        }
        copy {
            from file('src/main/resources/')
            into 'dist/conf'
        }
    }
}

该字段表示将jar文件打包放到dist/apps目录下,名字为项目名字+.jar,排除了一些文件,然后复制运行时的依赖包到dist/lib下,复制资源文件到dist/conf
注意,这一步要注意的是根据Gradle版本的不同,命令可能不一样,建议确定自己Gradle版本后(./gradlew -v),对应修改一下,然后手动编译./gradlew build,成功项目目录下会出现一个文件夹
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值