idea启动正常,打成jar包时,启动报错

背景

自己写了个小程序,在idea中启动正常,达成jar包发布时,启动报错。

Caused by: java.sql.SQLException: unknown jdbc driver :
at com.alibaba.druid.util.JdbcUtils.getDriverClassName(JdbcUtils.java:517)
at com.alibaba.druid.pool.DruidDataSource.resolveDriver(DruidDataSource.java:1203)
at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:887)
at com.alibaba.druid.pool.CoreDruidDataSource.init(CoreDruidDataSource.java:71)
… 152 common frames omitted

其实和报错本身没有关系,被报错误导,检查了半天jar包内容和maven的打包命令,结果是jar包启动命令的问题。

原因

我的启动命令如下:

java -jar .\zcm-docreader.jar -DCONFIG_HOME=D:\workspace\myapp\CONFIG_HOME 

如上所示,我将配置文件外挂,并通过环境变量来告诉应用外挂的配置文件目录。

然而java -jar启动命令中,参数不能放在jar包后面,或者说jar包路径要放在命令的最后面,否则命令读到了jar包路径后,后面的内容将会被忽略。

因为这个原因,导致我的应用没有读到配置文件,从而一直报驱动不存在。实属误导。

解决方案

将jar包路径放在命令的最后面。
如下:

java -jar -DCONFIG_HOME=D:\workspace\myapp\CONFIG_HOME .\zcm-docreader.jar

因为jar包路径后面的内容会被忽略,从而导致出现其他问题,这边记录一下,希望能帮到其他踩坑的人。

### Java 程序运行报错解决方案 当遇到 `错误: 找不到或无法加载主类` 的问题,通常是因为以下几个原因之一: 1. **编译后的 `.class` 文件未正确生成** 如果在终端执行 `javac TestProgram.java` 后没有生成对应的 `.class` 文件,则可能是由于文件名不匹配或者 JDK 配置有问题。确保源码文件名为 `TestProgram.java` 并且其中定义的公共类名称与文件名一致[^1]。 2. **运行命令路径设置有误** 使用 `java` 命令运行程序,需注意当前工作目录应位于 `.class` 文件所在位置。如果尝试通过绝对路径指定类文件(如 `java /path/to/classfile`),则会引发此错误。正确的做法是在目标目录下切换后再调用相应类名运行程序[^2]。 3. **环境变量配置不当** 若系统的 CLASSPATH 或 PATH 变量未正确定义也可能造成此类问题。确认 JAVA_HOME 已指向有效的 JDK 安装路径,并将其 bin 子目录加入到全局 PATH 中去。 4. **声明影响类定位** 当 Java 源文件含 package 语句,实际生成的 .class 文件会被放置于对应层次结构下的子文件夹里。此不仅需要调整好物理存储布局还要按照全限定名形式来引用该类对象实例化过程中的命名空间前缀部分不可遗漏比如对于属于 com.example 内的 MyClass 类来说应该这样启动它:`java com/example/MyClass` 以下是具体操作指南以及代码示例展示如何处理上述提到的各种情况: #### 正确的操作流程 假设我们有一个简单的 Hello World 应用程序存放在 `/home/user/projects/helloworld/src/main/java/com/example/App.java` 路径下面,其内容如下所示: ```java package com.example; public class App { public static void main(String[] args){ System.out.println("Hello from the app!"); } } ``` 我们需要遵循这些步骤来进行编译和执行这个应用程序: ##### 编译阶段 进入项目根目录即 src 上一层的位置然后执行以下指令完成整个项目的构建任务. ```bash $ cd /home/user/projects/helloworld/ $ javac -d ./out ./src/main/java/com/example/App.java ``` 这里 `-d` 参数指定了输出目录(out),而后面紧跟的是待编译的目标源文件. 成功后你会看到 out 目录内部形成了这样的树状结构反映出了我们的关系: ``` out/ └── com/ └── example/ └── App.class ``` ##### 运行阶段 同样回到 helloworld 主目录再发出如下命令即可正常打印消息出来: ```bash $ java -cp ./out com.example.App > Hello from the app! ``` 此处需要注意两点分别是设置了classpath(-cp选项)还有就是严格按照+类的形式给出入口点而不是单纯写成App那样简单版本. 以上便是针对原提问者所描述现象提供的一套完整的排查思路加上实践案例说明希望能够帮助解决问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值