Debian 10命令行运行带postgresql外部jar的Java程序异常求助
问题原因
- 类路径配置错误:你当前工作目录已经是
~/Music,依赖包和编译后的class文件都直接存放在该目录下,运行命令中写Music/postgresql-42.2.23.jar会尝试寻找~/Music/Music/postgresql-42.2.23.jar路径,实际不存在该路径,导致JDBC驱动加载失败。 - 异常被静默吞掉:代码中的catch块为空,所有运行时异常(包括数据库连接失败、表已存在报错、端口占用报错等)都不会输出日志,看起来就像程序无任何响应。
- 代码逻辑本身存在阻塞点:
ServerSocket.accept()是阻塞方法,在没有客户端连接4000端口的情况下,程序会一直卡在该步骤,不会执行后续打印逻辑。 - 数据库连接串不完整:PostgreSQL JDBC连接串需要明确指定目标数据库名,你写的
jdbc:postgresql://localhost/缺少库名,会导致连接失败。 - 建表逻辑兼容差:如果
jason表已经存在,直接执行CREATE TABLE会抛出异常,直接进入空catch块。 - 第一条运行命令格式错误:
java -cp .:Music/postgresql-42.2.23.jar:serverinsert把主类名放到了classpath参数中,系统找不到主类所以直接报错。
解决步骤
第一步:修改Java代码
调整后的代码核心修改点如下:
import java.sql.*; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class serverinsert { public static void main(String []V){ Connection c = null; Statement stmt = null; try { //连接本地数据库 Class.forName("org.postgresql.Driver"); // 补全你的目标数据库名,这里以dbname为例,替换为实际库名 c = DriverManager .getConnection("jdbc:postgresql://localhost:5432/dbname", "postgres", "gflow123"); System.out.println("Opened database successfully"); //本地建表 stmt = c.createStatement(); // 增加IF NOT EXISTS避免表已存在报错 String sql = "CREATE TABLE IF NOT EXISTS jason " + "(ID INT NOT NULL," + " sendata json NOT NULL)"; stmt.executeUpdate(sql); System.out.println("Table created successfully"); //开启DLC客户端连接监听 ServerSocket ss = new ServerSocket(4000); // 增加启动提示,确认程序正常运行到监听端口步骤 System.out.println("服务端已启动,等待客户端连接4000端口..."); Socket s = ss.accept(); System.out.println("客户端已连接"); StringBuilder sb = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String line; // 读取DLC数据存入content变量 String content=""; while((line = br.readLine()) != null){ sb.append(line).append(System.lineSeparator()); content = sb.toString(); } //移除DLC数据中的HTTP头内容 String jsn=content.substring(content.indexOf("{")); //DLC接收数据处理逻辑 System.out.println(jsn); String jsonreplacd=jsn.replace("[{\"name","\"name"); System.out.println(jsonreplacd); String jsonreplacd1=jsonreplacd.replace("\"name","[\"INSERT INTO jason (ID,sendata) \" + \"VALUES ('1','')"); System.out.println(jsonreplacd1); String jsonreplacd2=jsonreplacd1.replace("')\":\"press\",\"datatype\":\"float\",\"content\":",""); System.out.println(jsonreplacd2); String jsn2=jsonreplacd2.substring(jsonreplacd2.indexOf("[")); System.out.println(jsn2); String jsn3=jsn2.replace("[{","{"); System.out.println(jsn3); String jsn4=jsn3.replace("\"t\"","\\\"t\\\""); System.out.println(jsn4); String jsn5=jsn4.replace("\"v\"","\\\"v\\\""); System.out.println(jsn5); String jsn6=jsn5.replace(":",":\\\""); System.out.println(jsn6); String jsn7=jsn6.replace(",\\","\\\",\\"); System.out.println(jsn7); String jsn8=jsn7.replace("},","\\\"},"); System.out.println(jsn8); String jsn9=jsn8.replace("}]}]}}","\\\"}')\""); System.out.println(jsn9); String jsn10=jsn9.replace("[",""); System.out.println(jsn10); String jsn11=jsn10.replace("},{","}')\",\"INSERT INTO jason (ID,sendata) \" + \"VALUES ('1','{"); System.out.println(jsn11); String jsn12=jsn11.replace("\",\"","\"@\""); System.out.println(jsn12); String[] data = jsn12.split("@"); for(int i=0;i<5;i++) { System.out.println(data[i]); } s.close(); stmt.close(); c.close(); } // 新增异常打印,出现问题可以直接看到报错信息 catch(Exception e){ e.printStackTrace(); } } }
第二步:重新编译代码
在~/Music目录下执行编译命令:
javac -cp postgresql-42.2.23.jar serverinsert.java
第三步:执行运行命令
正确的前台运行命令如下:
java -cp .:postgresql-42.2.23.jar serverinsert
如果需要后台运行服务,可使用以下命令:
nohup java -cp .:postgresql-42.2.23.jar serverinsert &
内容的提问来源于stack exchange,提问作者Yushantha chathuranga
相关产品推荐
相关产品推荐

