Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从批处理文件调用Java程序时需要帮助_Java_Postgresql_Batch File_Jdbc - Fatal编程技术网

从批处理文件调用Java程序时需要帮助

从批处理文件调用Java程序时需要帮助,java,postgresql,batch-file,jdbc,Java,Postgresql,Batch File,Jdbc,我有一个非常简单的Java程序,它连接到PostgreSQL数据库,以通过特定的命名模式查找是否存在任何数据库。当我找到它们时,我正试图通过JavaJDBC代码删除它们。当我手动运行Java代码时,它工作得很好,但我试图实现的是通过批处理文件自动化这个Java调用 有人能解释一下吗?令人沮丧的是,我一直在努力寻找解决方案 我的Java代码: public class CreateBatchToCleanNamedDBs { public static void main(String[]

我有一个非常简单的Java程序,它连接到PostgreSQL数据库,以通过特定的命名模式查找是否存在任何数据库。当我找到它们时,我正试图通过JavaJDBC代码删除它们。当我手动运行Java代码时,它工作得很好,但我试图实现的是通过批处理文件自动化这个Java调用

有人能解释一下吗?令人沮丧的是,我一直在努力寻找解决方案

我的Java代码:

public class CreateBatchToCleanNamedDBs {
    public static void main(String[] args) {
        Connection connection = null;
        BufferedReader input = null;
        try {
            String line;
            RandomAccessFile batchFile = new RandomAccessFile("C:/batch.sql", "rw");
            Class.forName("org.postgresql.Driver");
            connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "Welcome12!");
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery("select datname from pg_database where datname like 'sample_db%';");

            while (rs.next()) {
                batchFile.writeBytes("DROP DATABASE " + rs.getString("datname") + ";\n");
                System.out.println(rs.getString("datname"));
            }

            Process batchProcess = Runtime.getRuntime().exec("C:/Program Files/PostgreSQL/9.5/bin/psql -h localhost -U postgres -f C:/batch.sql");
            input = new BufferedReader(new InputStreamReader(batchProcess.getInputStream()));
            if(batchFile.length()!= 0) {
                while ((line = input.readLine()) != null) {
                  System.out.println(line);
                }
            }
            batchFile.close();
        } catch(Exception exception) {
            System.out.println("Exception caught: " + exception);
            exception.printStackTrace();
        } finally {
            try {
                connection.close();
            } catch (SQLException sqlexception) {
                sqlexception.printStackTrace();
            }
        }
    }
}
我的批处理文件脚本:

@echo off
setlocal

if not defined JAVA_HOME    goto :NoJavaFound

"%JAVA_HOME%\bin\java.exe" -jar "%~dp0\deletedb.jar;%~dp0\postgresql-9.4.1207.jar;" connect.postgresql.CreateBatchToCleanNamedDBs
goto :end

:NoJavaFound
echo JAVA_HOME environment variable is not set.
goto :end

:end
endlocal
我在桌面上有jar文件(我的Java代码,如上所示)和批处理脚本文件(同一文件夹)并试图运行,但是我得到了一个
NullPointerException
,因为我的Java代码缺少PostgreSQL jdbc驱动程序。我曾尝试以多种方式将其作为参数添加,但没有任何效果

错误详细信息:

C:\Users\pavan>C:\Users\pbonda\Desktop\deletedb.bat
Exception caught: java.lang.ClassNotFoundException: org.postgresql.Driver
java.lang.ClassNotFoundException: org.postgresql.Driver
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at connect.postgresql.CreateBatchToCleanNamedDBs.main(CreateBatchToCleanNamedDBs.java:20)
Exception in thread "main" java.lang.NullPointerException
        at connect.postgresql.CreateBatchToCleanNamedDBs.main(CreateBatchToCleanNamedDBs.java:45)
尝试:

"%JAVA_HOME%\bin\java.exe" -cp  "%~dp0\postgresql-9.4.1207.jar;%~dp0\deletedb.jar" connect.postgresql.CreateBatchToCleanNamedDBs
尝试:

"%JAVA_HOME%\bin\java.exe" -cp  "%~dp0\postgresql-9.4.1207.jar;%~dp0\deletedb.jar" connect.postgresql.CreateBatchToCleanNamedDBs

使用可执行jar调用java时,将忽略提供给java命令的类路径

你应该:

  • 使用类路径中的jar显式调用目标类(即
    %JAVA\u HOME%\bin\JAVA.exe“-cp”%~dp0\deleteddb.jar;%~dp0\postgresql-9.4.1207.jar;“connect.postgresql.CreateBatchToCleanNamedDBs
  • 在MANIFEST.MF文件中指定jar的类路径依赖项及其主类;然后可以使用
    java-jar
    执行jar。看到这个了吗
  • 将postgresql jar添加到当前jre的扩展库目录或全局扩展库目录中。看到这个了吗

使用可执行jar调用java时,将忽略提供给java命令的类路径

你应该:

  • 使用类路径中的jar显式调用目标类(即
    %JAVA\u HOME%\bin\JAVA.exe“-cp”%~dp0\deleteddb.jar;%~dp0\postgresql-9.4.1207.jar;“connect.postgresql.CreateBatchToCleanNamedDBs
  • 在MANIFEST.MF文件中指定jar的类路径依赖项及其主类;然后可以使用
    java-jar
    执行jar。看到这个了吗
  • 将postgresql jar添加到当前jre的扩展库目录或全局扩展库目录中。看到这个了吗

感谢您的回答,但我现在收到以下错误:
错误:无法访问jar文件C:\Users\pavan\Desktop\\deletedb.jar谢谢你的回答,但我现在得到了以下错误:
错误:无法访问jar文件C:\Users\pavan\Desktop\\deletedb.jar-jar
,而它应该使用
-cp
。对于第二个解决方案,我将发布一些文档的链接,但我非常确定第一个更适合您的需要。哦,我刚刚想到了第三个解决方案,这可能是一个很好的替代方案,我还要补充一点。在这里,我想不出任何其他的解决方案。我会推荐dev中的第三个解决方案,因为它具有灵活性,第一个和第二个解决方案中的一个用于生产,这取决于您对运行它的环境的控制程度。。。意识到了!谢谢你的帮助!请注意,第三个选项(扩展机制)在Java8中已被弃用,并将从Java9中删除。细节。亚伦,你提到的第一个选择就是我现在正在做的。对于第二个,如何或需要添加什么-我的意思是,您正在谈论哪些jar要添加到manifest.mf文件?@BPavanKumar您确定这是您当前所做的吗?如果是这样,您应该编辑您发布的批处理文件,因为它当前不正确,请使用
-jar
,而它应该使用
-cp
。对于第二个解决方案,我将发布一些文档的链接,但我非常确定第一个更适合您的需要。哦,我刚刚想到了第三个解决方案,这可能是一个很好的替代方案,我还要补充一点。在这里,我想不出任何其他的解决方案。我会推荐dev中的第三个解决方案,因为它具有灵活性,第一个和第二个解决方案中的一个用于生产,这取决于您对运行它的环境的控制程度。。。意识到了!谢谢你的帮助!请注意,第三个选项(扩展机制)在Java8中已被弃用,并将从Java9中删除。细节。