Java I';我在Eclipse外部运行JAR时遇到异常,但在Eclipse内部运行时却没有——为什么?

Java I';我在Eclipse外部运行JAR时遇到异常,但在Eclipse内部运行时却没有——为什么?,java,server,jar,Java,Server,Jar,我试图用3个参数运行我的JAR文件。其中一个参数是xml文件的路径。在导出JAR文件之前,它在Eclipse中工作良好。但在Eclipse之外运行JAR文件时,它不起作用 这个解决方案是一个客户机/服务器解决方案,我在其中从javaScript运行本地jar文件(客户机)。客户机在服务器端调用servlet 1) JavaScript代码是: function runClientFunc(arg1, arg2, arg3) { debugger; var jarFilePat

我试图用3个参数运行我的JAR文件。其中一个参数是xml文件的路径。在导出JAR文件之前,它在Eclipse中工作良好。但在Eclipse之外运行JAR文件时,它不起作用

这个解决方案是一个客户机/服务器解决方案,我在其中从javaScript运行本地jar文件(客户机)。客户机在服务器端调用servlet

1) JavaScript代码是:

function runClientFunc(arg1, arg2, arg3) {

    debugger;

    var jarFilePath = document.interpret("PRGDIR()") + "\Scripts\\";
    var jarFile = jarFilePath + "WebClient.jar";    
    var runJar = new ActiveXObject("Shell.Application");
    runJar.ShellExecute(jarFile, "arg1 arg2 arg3", "", "open", 1);

}
public class CalcServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    static final int BUFFER_SIZE = 4096;    

    //Do required initialization of servlet
    public void init() throws ServletException {        

    }   

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        //Gets file name from HTTP header and makes new name for output file
        String fileNameInput = request.getHeader("fileName");       

        //Prints out all header values for test purpose
        System.out.println("===== Begin headers =====");
        Enumeration<String> names = request.getHeaderNames();
        while (names.hasMoreElements()) {
            String headerName = names.nextElement();
            System.out.println(headerName + " = " + request.getHeader(headerName));        
        }
        System.out.println("===== End headers =====\n");

        FileOutputStream outputStream = null;
        InputStream inputStream = null;

        try {
            //Opens input stream of the request for reading data
            inputStream = request.getInputStream();

            //Opens an output stream for writing file
            outputStream = new FileOutputStream(fileNameInput);

            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = -1;
            System.out.println("Receiving data...");

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            System.out.println("Data received.");

        } catch (IOException ioe) {         
            System.out.println("Error:" + ioe.getMessage()); 
            ioe.printStackTrace();

        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }           
        }       

        //*****Using file from client in server side calculation*****       

               //Some business calculation is done here and the result is outputxml


                //Making string from output stream
                outputXml = new String(outputStreamFromCalc.toByteArray());

            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (XmlException e) {
            e.printStackTrace();
        }        

        //**RESPONSE**
        //************ 
        //Opens an output stream for writing file
        ServletOutputStream outputStreamOutput = null;               
        //Opens an input stream for reading data
        InputStream inputStreamOutput = null;            

        try {

            //Converts from string variable to inputstream
            inputStreamOutput = new ByteArrayInputStream(outputXml.getBytes(StandardCharsets.UTF_8));           

            outputStreamOutput = response.getOutputStream();
            response.setContentType("text/xml");            
            response.setHeader("Content-Disposition", "attachment; filename=" + fileNameInput);                 

            byte[] bufferOutput = new byte[BUFFER_SIZE];
            int bytesReadOutput = -1;
            System.out.println("Sending xml to client...");

            while ((bytesReadOutput = inputStreamOutput.read(bufferOutput)) != -1) {
                outputStreamOutput.write(bufferOutput, 0, bytesReadOutput);
            }                   

            System.out.println("Data received.");

        } catch (IOException ioe) {         
            System.out.println("Error:" + ioe.getMessage()); 
            ioe.printStackTrace();

        } finally {
            if (outputStreamOutput != null) {
                outputStreamOutput.close();
            }
            if (inputStreamOutput != null) {
                inputStreamOutput.close();
            }           
        }       
    }

    //Ensures that POST method, and not browser default GET method, is used or else failure 405
    public void doGet (HttpServletRequest request, 
            HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    //Do required destroy of servlet
    public void destroy() {

    }
}

2) JAR文件中的代码是:

public class WebClient {

    static final int BUFFER_SIZE = 4096;

    public static void main(String[] args) throws IOException, URISyntaxException {
        //Takes file path (input file), url and savedir (directory to save output file) as arguments
        String filePath = args[0];
        String uploadUrl = args[1];
        String saveDir = args[2];
        File uploadFile = new File(filePath);
        //
        //File uploadFile = new File(TaxWebClient.class.getResource(filePath).toURI());        

        System.out.println("File to upload: " + filePath);

        HttpURLConnection httpConn = null;
        OutputStream outputStream = null;
        FileInputStream inputStream = null;
        //InputStream inputStream = null;

        try {
            //Creates a HTTP connection
            URL url = new URL(uploadUrl);
            httpConn = (HttpURLConnection) url.openConnection();

            //Set timeout (10 and 15 sec.)
            httpConn.setConnectTimeout(10000);  
            httpConn.setReadTimeout(15000);

            //Set output & request type 
            httpConn.setUseCaches(false);
            httpConn.setDoOutput(true);
            httpConn.setRequestMethod("POST");        

            //Set headers
            httpConn.setRequestProperty("Accept", "text/xml");
            httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");

            //Sets file name as a HTTP header
            httpConn.setRequestProperty("fileName", uploadFile.getName());

            //Opens output stream of the HTTP connection for writing data
            outputStream = httpConn.getOutputStream();

            //Opens input stream of the file for reading data
            inputStream = new FileInputStream(uploadFile);

            //Loads file from filePath (arg0) when running as JAR file else JAR file won't work
            //inputStream = TaxWebClient.class.getClassLoader().getResourceAsStream(filePath);

            //Writing data to servlet (outputstream)
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = -1;

            System.out.println("Start writing data...");

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            System.out.println("Data was send to servlet.");

        } catch (IOException ioe) {         
            System.out.println("Error:" + ioe.getMessage()); 
            ioe.printStackTrace();

        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }           
        }        

        //**RESPONSE**
        //************       
        //Always check HTTP response code from server
        int responseCode = httpConn.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {

            System.out.println("Server's response: " + responseCode);

            InputStream inputStreamFromServlet = null;
            //ByteArrayOutputStream byteOutputStreamFromServlet = null;
            FileOutputStream fileOutputStreamFromServlet = null;
            //OutputStreamWriter outputStreamWriterFromServlet = null;

            //String xmlContentFromServlet = null;

            try {
                //****Getting xml file from response**** 

                //Making output filename from input filename
                String fileNameInputWithOutExtension = FilenameUtils.removeExtension(uploadFile.getName());
                String fileNameOutput = fileNameInputWithOutExtension + "Output.xml";                               

                File saveFile = new File(saveDir + fileNameOutput);

                //Opens input stream of the response for reading data
                inputStreamFromServlet = httpConn.getInputStream();                       

                //Opens output stream for writing bytes 
                //byteOutputStreamFromServlet = new ByteArrayOutputStream();

                //Opens an output stream for writing file
                fileOutputStreamFromServlet = new FileOutputStream(saveFile);

                //Turns bytes based stream into character based writer
                //outputStreamWriterFromServlet = new OutputStreamWriter(new FileOutputStream(saveFile), "UTF-8");

                //Writes response from servlet (bites) to byte object - the approach is used because the byte object can be used in more situations 
                byte[] bufferOutput = new byte[BUFFER_SIZE];
                int bytesReadOutput = -1;
                System.out.println("Receiving data...");

                //Writes file from input stream
                while ((bytesReadOutput = inputStreamFromServlet.read(bufferOutput)) != -1) {
                    fileOutputStreamFromServlet.write(bufferOutput, 0, bytesReadOutput);
                }           

                /*Nedenstående kan bruges hvis outputstream skal gemmes som en variabel mv.
                while ((bytesReadOutput = inputStreamFromServlet.read(bufferOutput)) != -1) {
                    byteOutputStreamFromServlet.write(bufferOutput, 0, bytesReadOutput);
                }     

                //Converts byte object to string object using the specified character set
                xmlContentFromServlet = byteOutputStreamFromServlet.toString("UTF-8");              

                //Turns bytes based stream into character based writer (and Opening an output stream for writing file)
                outputStreamWriterFromServlet = new OutputStreamWriter(new FileOutputStream(saveFile), "UTF-8");

                //Writes file with the chosen UTF
                outputStreamWriterFromServlet.write(xmlContentFromServlet);             
                */

                System.out.println("Data received.");            

                System.out.println("File written to: " + saveFile.getAbsolutePath());

            } catch (IOException ioe) {         
                System.out.println("Error:" + ioe.getMessage()); 
                ioe.printStackTrace();

            } finally {
                if (fileOutputStreamFromServlet != null) {
                    fileOutputStreamFromServlet.close();
                }
                if (inputStreamFromServlet != null) {
                    inputStreamFromServlet.close();
                }
                /*
                if (byteOutputStreamFromServlet != null) {
                    byteOutputStreamFromServlet.close();
                }
                if (outputStreamWriterFromServlet != null) {
                    outputStreamWriterFromServlet.close();
                }
                */              
            }       
        } else {
            System.out.println("Server returned non-OK code: " + responseCode);
        }        
    }
}
3) Servlet代码是:

function runClientFunc(arg1, arg2, arg3) {

    debugger;

    var jarFilePath = document.interpret("PRGDIR()") + "\Scripts\\";
    var jarFile = jarFilePath + "WebClient.jar";    
    var runJar = new ActiveXObject("Shell.Application");
    runJar.ShellExecute(jarFile, "arg1 arg2 arg3", "", "open", 1);

}
public class CalcServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    static final int BUFFER_SIZE = 4096;    

    //Do required initialization of servlet
    public void init() throws ServletException {        

    }   

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        //Gets file name from HTTP header and makes new name for output file
        String fileNameInput = request.getHeader("fileName");       

        //Prints out all header values for test purpose
        System.out.println("===== Begin headers =====");
        Enumeration<String> names = request.getHeaderNames();
        while (names.hasMoreElements()) {
            String headerName = names.nextElement();
            System.out.println(headerName + " = " + request.getHeader(headerName));        
        }
        System.out.println("===== End headers =====\n");

        FileOutputStream outputStream = null;
        InputStream inputStream = null;

        try {
            //Opens input stream of the request for reading data
            inputStream = request.getInputStream();

            //Opens an output stream for writing file
            outputStream = new FileOutputStream(fileNameInput);

            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = -1;
            System.out.println("Receiving data...");

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            System.out.println("Data received.");

        } catch (IOException ioe) {         
            System.out.println("Error:" + ioe.getMessage()); 
            ioe.printStackTrace();

        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }           
        }       

        //*****Using file from client in server side calculation*****       

               //Some business calculation is done here and the result is outputxml


                //Making string from output stream
                outputXml = new String(outputStreamFromCalc.toByteArray());

            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (XmlException e) {
            e.printStackTrace();
        }        

        //**RESPONSE**
        //************ 
        //Opens an output stream for writing file
        ServletOutputStream outputStreamOutput = null;               
        //Opens an input stream for reading data
        InputStream inputStreamOutput = null;            

        try {

            //Converts from string variable to inputstream
            inputStreamOutput = new ByteArrayInputStream(outputXml.getBytes(StandardCharsets.UTF_8));           

            outputStreamOutput = response.getOutputStream();
            response.setContentType("text/xml");            
            response.setHeader("Content-Disposition", "attachment; filename=" + fileNameInput);                 

            byte[] bufferOutput = new byte[BUFFER_SIZE];
            int bytesReadOutput = -1;
            System.out.println("Sending xml to client...");

            while ((bytesReadOutput = inputStreamOutput.read(bufferOutput)) != -1) {
                outputStreamOutput.write(bufferOutput, 0, bytesReadOutput);
            }                   

            System.out.println("Data received.");

        } catch (IOException ioe) {         
            System.out.println("Error:" + ioe.getMessage()); 
            ioe.printStackTrace();

        } finally {
            if (outputStreamOutput != null) {
                outputStreamOutput.close();
            }
            if (inputStreamOutput != null) {
                inputStreamOutput.close();
            }           
        }       
    }

    //Ensures that POST method, and not browser default GET method, is used or else failure 405
    public void doGet (HttpServletRequest request, 
            HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    //Do required destroy of servlet
    public void destroy() {

    }
}

公共类CalcServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
静态最终整数缓冲区大小=4096;
//执行所需的servlet初始化
public void init()引发ServletException{
}   
受保护的void doPost(HttpServletRequest请求,
HttpServletResponse响应)引发ServletException,IOException{
//从HTTP头获取文件名,并为输出文件命名
字符串fileNameInput=request.getHeader(“文件名”);
//出于测试目的,打印出所有标题值
System.out.println(“==beginheaders===”);
枚举名称=request.getHeaderNames();
while(names.hasMoreElements()){
字符串headerName=names.nextElement();
System.out.println(headerName+“=”+request.getHeader(headerName));
}
System.out.println(“=======结束头========\n”);
FileOutputStream outputStream=null;
InputStream InputStream=null;
试一试{
//打开读取数据请求的输入流
inputStream=request.getInputStream();
//打开输出流以写入文件
outputStream=新的FileOutputStream(fileNameInput);
字节[]缓冲区=新字节[缓冲区大小];
int字节读取=-1;
System.out.println(“接收数据…”);
而((bytesRead=inputStream.read(缓冲区))!=-1){
写入(缓冲区,0,字节读取);
}
System.out.println(“数据接收”);
}捕获(ioe异常ioe){
System.out.println(“错误:+ioe.getMessage());
ioe.printStackTrace();
}最后{
if(outputStream!=null){
outputStream.close();
}
如果(inputStream!=null){
inputStream.close();
}           
}       
//*****在服务器端计算中使用来自客户端的文件****
//这里进行了一些业务计算,结果是outputxml
//从输出流生成字符串
outputXml=新字符串(outputStreamFromCalc.toByteArray());
}捕获(IOE异常){
e、 printStackTrace();
}
}捕获(XMLE异常){
e、 printStackTrace();
}        
//**回应**
//************ 
//打开输出流以写入文件
ServletOutputStream outputStreamOutput=null;
//打开用于读取数据的输入流
InputStream inputStreamOutput=null;
试一试{
//从字符串变量转换为inputstream
inputStreamOutput=new ByteArrayInputStream(outputXml.getBytes(StandardCharsets.UTF_8));
outputStreamOutput=response.getOutputStream();
setContentType(“text/xml”);
response.setHeader(“内容处置”、“附件;文件名=“+fileNameInput”);
字节[]缓冲输出=新字节[缓冲区大小];
int byteReadOutput=-1;
System.out.println(“将xml发送到客户端…”);
而((bytesReadOutput=inputStreamOutput.read(bufferOutput))!=-1){
outputStreamOutput.write(缓冲输出,0,字节读取输出);
}                   
System.out.println(“数据接收”);
}捕获(ioe异常ioe){
System.out.println(“错误:+ioe.getMessage());
ioe.printStackTrace();
}最后{
if(outputStreamOutput!=null){
outputStreamOutput.close();
}
if(inputStreamOutput!=null){
inputStreamOutput.close();
}           
}       
}
//确保使用POST方法,而不是浏览器默认的GET方法,否则失败405
公共无效数据集(HttpServletRequest请求,
HttpServletResponse响应)引发ServletException,IOException{
doPost(请求、响应);
}
//是否需要销毁servlet
公共空间销毁(){
}
}
我在本地主机Tomcat上遇到以下故障:

HTTP状态500–内部服务器错误


类型异常报告

说明服务器遇到意外情况,无法满足请求

Exception
java.lang.NullPointerException
    java.io.FileOutputStream.<init>(Unknown Source)
    java.io.FileOutputStream.<init>(Unknown Source)
    CalcServlet.doPost(CalcServlet.java:71)  
    CalcServlet.doGet(CalcServlet.java:180)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

异常
java.lang.NullPointerException
java.io.FileOutputStream。(未知源)
java.io.FileOutputStream。(未知源)
doPost(CalcServlet.java:71)
doGet(CalcServlet.java:180)
javaservlet.http.HttpServlet.service(HttpServlet.java:634)
javaservlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

您能在CalcServlet中指出71号和180号线吗您能在CalcServlet中指出71号和180号线吗