![](/img/trans.png)
[英]How to make executable file for deploy Maven java web project with rest api to server
[英]How to make a Rest API call to start an executable file in java
誰能提供有關如何進行Rest API調用以使用Java啟動可執行文件的建議? 假設我本地有一個可執行文件,並且想對該可執行文件進行REST api調用。
servlet和jsp的代碼片段
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws
IOException {
try{
PrintWriter out = res.getWriter();
String browsefile = req.getParameter("browsefile");
if(browsefile == null || browsefile.equals("")){
out.println("File does not exist");
throw new ServletException("File Name can't be
null or empty");
}
File file = new File("C:/lic/test.li");
// File file = new File("C:/apache-tomcat-
7.0.42/webapps/Lic/test.li");
if(!file.exists()){
out.println("File does not exist");
throw new ServletException("File doesn't exists
on server.");
}
res.setContentType("text/html;charset=UTF-8");
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec
("C:\\tools\\server\\grd.exe" );
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(pr.getInputStream()));
BufferedReader input = new BufferedReader(stdInput);
String serverstarted="";
StringBuffer startOutput = new StringBuffer();
while((serverstarted = input.readLine()) !=
null){
startOutput.append(serverstarted
+ "\n");
}
req.setAttribute("startOutput",
startOutput.toString());
req.getRequestDispatcher
("grdoptions.jsp").forward(req, res);
}catch (Throwable t)
{
t.printStackTrace();
}
finally {
} }
}
JSP:
<form action="start" METHOD="GET" enctype="multipart/form-data">
<input type="file" name="browsefile" />
<input type="submit" name="start"
value="StartServer" />
</form>
<div id="result">
<pre>
${requestScope.startOutput}
</pre>
</div>
Web.XML:
<servlet>
<servlet-name>Start</servlet-name>
<servlet-class>com.abc.lic.Start</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Start</servlet-name>
<url-pattern>/start</url-pattern>
</servlet-mapping>
您已將此文件保存在Java下,因此我將其保留在Java中,並假定您有一些Java Web容器或其他可用的Web容器。 您將需要創建一個包裝器組件(Servlet等),並部署到Web容器中,以使用RESTful API創建服務。
服務的實現將使用Java API通過Runtime.getRuntime().exec()
調用或使用Process / ProcessBuilder類進行系統調用。 后者可能是首選。 取決於您需要對可執行文件執行的操作。
添加為對您的評論和更新的問題的回應:
我認為,您是那里的大部分(可以說是全部)。 為了簡化起見,REST是使用標准的HTTP方法和動詞使服務可用。
您可以輕松地說出您擁有的代碼已經是RESTful的。 您已經響應了包含多部分表單數據並運行可執行文件的POST請求。 現在,有人在使用瀏覽器。 但是,位於另一個客戶端上的任何代碼段都可以在服務中發布。
添加了更多內容以完成該想法:
另外,關於您的實現還有一件事。 您可能希望使POST的URI沒有參數。 也就是說,您可以使URI為/start/[filename reference]
,而不是/start?browseFile=[filename reference]
。 那會是更多的REST-y,但是並不是完全需要的。 在這種情況下,您必須從路徑中提取文件名。
最后一點:如果您也想保留基於表單的提交,則可能值得將此代碼的“內容”提取到Java類中。 有很多方法可以對其進行切片,但是該類可以封裝嘗試打開文件的步驟,並在找到文件后執行EXE。 可以從現有的基於表單的JSP和新的“ REST” JSP中調用該類,該新的“ REST” JSP的URI路徑略有不同,並且返回JSON。
您擁有所有部分,只需要將它們組裝成RESTful服務即可。
聽起來您對Java應該做什么以及REST是什么感到困惑。 如您所描述的,這將需要在一台計算機上運行兩個可執行文件。 一個將是始終保持活動狀態,監聽請求的REST服務器。 另一個可能是Java可執行文件,該文件可能運行然后死亡。 您可以用任何語言編寫的REST服務器,我將使用比Java輕量級的語言,因為基於它的作用,它實際上不應超過5行。 換句話說,這里沒有“ REST API”。 您可以使用其REST庫之一用Java編寫服務器組件。
但這提出了一個問題:為什么要有兩個過程? 聽起來您只希望運行一個Java服務器,當請求進入時,該Java服務器將執行一個操作 。此操作將是可執行文件將運行的任何代碼,但不會運行另一個可執行文件。
但這聽起來像是您遇到了引導問題。 某些應用程序必須作為服務器運行,以偵聽請求。 該過程如何開始? 在服務器上的初始化腳本中,您可以手動使用諸如Heroku或AWS的平台,但是不可避免地要擁有此組件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.