mj@home:~$

JAVA의 jnlp를 사용한 웹 상에서 application 실행

JNLP ?

Java Network Launching Protocol

  • 웹상에서 java application을 실행시킬수 있는 프로토콜
  • java에서 지원하는 JWS(java web start) 기능을 가지고 실행한다.

JNLP 예제

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://127.0.0.1:8080" href="/file_upload.jnlp?message=111">
	<information>
		<title>File Upload Test</title>
		<vendor>YMtech</vendor>
		<homepage href="https://wwww.ymtech.co.kr/" />
		<description>KISTI Large File Upload Test</description>
	</information>
	<security>
		<all-permissions/>
	</security>
	<resources>
		<j2se version="1.8+" />
		<jar href="file_upload.jar" />
	</resources>
	<application-desc main-class="kr.co.ymtech.Main">
		<argument>111</argument>
	</application-desc>
</jnlp>

Tag 설명

  1. jnlp
    • codebase: 서버 상에 있는 JWS와 관련된 내용이 있는 기본 디렉토리를 설정, context path가 포함된 server url로 설정하면 된다.
    • href: codebase를 기준으로 .jnlp 파일의 상대적인 경로
  2. information
    • 작성자, 파일 정보를 정의한다.
    • title, vendor, homepage, description 등등을 포함한다.
  3. j2se
    • 어플리케이션을 실행할 java version을 입력한다.
  4. jar
    • 실제로 실행될 어플리케이션의 위치를 설정한다. codebase + jar로 접근 할 수 있는 위치여야한다.
  5. application-desc
    • main-class: application이 초기 실행되는 main class의 위치. application project 내의 package
    • argument: application이 실행될때 필요한 argument

JNLP 실행 설정

1. jar 파일에 security 적용

  • jar 파일을 client에서 사용하기 위해서는 인증이 되어있어야한다.
  • 위 인증 작업을 하기 위해선 java와 인증서 파일이 있어야 한다.
jarsigner -keystore [인증서 파일] [적용한 jar 파일] [인증된 alias 이름]

2. tomcat 설정

  • tomcat에서 JNLP를 사용할 수 있는 설정이 필요하다.
  • tomcat의 web.xml을 수정한다.
  • tomcat의 기본적으로 jnlp에 관련된 설정이 되어있기 때문에 확인만 해도 된다.
<mime-mapping>
    <extension>jnlp</extension>
    <mime-type>application/x-java-jnlp-file</mime-type>
</mime-mapping>

JNLP 파일 동적 생성

  • 위에서 설명한 argument를 동적으로 받기 위해서는 동적으로 jnlp 파일을 생성하고 이를 client에게 전달해야한다.
@RequestMapping(path = "/d/{token}", method = RequestMethod.GET)
public void downloadLargeFile(@PathVariable("token") String token, HttpServletRequest request, HttpServletResponse response) throws IOException {
    String codebase = downloadService.getCodebase();
    String jarPath = request.getContextPath() +  "/jar/LargeFileDownloader.jar";
    String href = request.getContextPath() + "/api/d/" + token;

    String sftpRequestUrl = "/api/sftp/" + token;
    String tokenDeleteUrl = "/api/token/" + token;

    response.setHeader("pragma", "no-cache");
    response.setHeader("Expires", "0");
    // 응답받을 형태를 jnlp file로 설정
    response.setContentType("application/x-java-jnlp-file");

    StringBuffer jnlp = new StringBuffer();
    jnlp.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
        .append("<jnlp spec=\"1.0+\" codebase=\"" + codebase + "\" href=\"" + href + "\">")
        .append("    <information>")
        .append("        <title>Large File Downloader</title>")
        .append("        <vendor>YMtech</vendor>")
        .append("        <homepage href=\"https://wwww.ymtech.co.kr/\" />")
        .append("        <description>KISTI Large File Downloader</description>")
        .append("    </information>")
        .append("    <security>")
        .append("        <all-permissions/>")
        .append("    </security>")
        .append("    <resources>")
        .append("        <j2se version=\"1.8+\" />")
        .append("        <jar href=\"" + jarPath + "\" />")
        .append("    </resources>")
        .append("    <application-desc>")
        .append("       <argument>" + codebase + sftpRequestUrl + "</argument>")
        .append("       <argument>" + codebase + tokenDeleteUrl + "</argument>")
        .append("    </application-desc>")
        .append("</jnlp>");
    
    // 생성한 jnlp파일 정보를 response에 담아서 보냄.
    // 이런식으로 생성하면 받는 client에서는 jnlp파일을 다운로드 받는다. 이를 실행하면 jnlp정보를 기반으로 jar파일을 실행한다.
    response.getWriter().print(jnlp.toString());
}