1. appcompiler

appcompiler는 EJB 인터페이스 Impl, Skeleton, Stub 클래스, JSP를 컴파일하여 서블릿 클래스, 웹 서비스의 Endpoint 클래스 등을 생성하는 애플리케이션 컴파일러이다.

appcompiler는 EJB 2.1 인터페이스의 Impl 클래스, RMI Stub과 Skeleton 클래스, 웹 모듈의 JSP를 컴파일해서 서블릿 클래스들을 미리 생성하기 위해 사용할 수 있다. EJB 3.0 인터페이스로만 구성된 EJB의 경우나 JAX-WS 클라이언트, 서버 애플리케이션은 이 툴을 실행할 필요가 없다.

이 툴은 다음과 같은 경우에 사용하면 효과적이다.

  1. EJB 2.x 표준에 준하는 Bean들이 많아서 최초 디플로이 시간이 오래 걸리는 경우

  2. 서비스 타임에 JSP 컴파일할 시간이 오래 걸려서 미리 컴파일을 해두어야 하는 경우

EJB 2.x 모듈의 경우에는 deploy할 때에 애플리케이션에 fast-deploy 설정을 해야 한다. 또는 jeusadmin 콘솔 툴의 deploy 명령어에 [-fast] 옵션을 추가한다. 이 옵션을 통해서 모듈의 런타임 deploy하는 경우 appcompiler가 자동으로 수행되는 것을 막을 수 있다. EJB 엔진은 fast-deploy 옵션이 설정된 경우 인터페이스 Impl, Skeleton, Stub 클래스들을 생성하고 컴파일하는 과정을 수행하지 않고, 미리 생성된 클래스들을 사용해서 deploy할 때 시간을 줄일 수 있다. EJB 3.x 모듈의 경우 appcompiler가 수행되지 않는다. 따라서 하나의 모듈안에 EJB 3.x 모듈내에 EJB 2.x가 함께존재하더라도 appcompiler는 수행되지 않는다.

웹 엔진은 JSP에 대한 컴파일된 서블릿 클래스 파일이 있을 경우에는 실제 서비스 타임에 컴파일하지 않는다. 이 툴에는 하나의 파일을 생성한 후 컴파일하는 Each 모드와 모든 파일을 생성한 후 한 번에 컴파일하는 Batch 모드가 있다. Batch 모드는 Each 모드에 비해 속도는 빠르지만 컴파일할 때 에러가 나면 원인이 되는 파일을 찾기 힘들다는 단점이 있다. 기본 동작은 Each 모드이므로 Batch 모드를 원할 경우 [-batch] 옵션을 이용하거나 jeus.app.compiler.mode=batch를 설정한다. 단, Batch 모드는 EJB 2.x 모듈에만 적용된다.

Windows에서 WAR 파일에 대해 appcompiler 수행할 때 임시로 만든 디렉터리가 지워지지 않을 수 있다. 이는 java.net.URLClassLoader가 WAR 파일 내부에 포함된 WEB-INF/lib/*.jar 파일들을 명시적으로 닫을 수 없기 때문이다. java.net.URLClassLoader의 경우 Java 7부터 close 메소드가 추가되었으므로 이에 기반하는 향후 버전에서는 문제가 생기지 않을 것이다. 그러나 현재는 임시 디렉터리를 수동으로 삭제해야 한다.

다음은 툴 사용법, 파라미터 및 예제에 대한 설명이다.

  • 사용법

    appcompiler [-h]
                [-verbose]
                [-clp <class-path>]
                [-keep]
                [-jspmap]
                [-batch]
                [-q]
                [-client <clientview_filename>]
                [-noaddfile]
                [-deloldgen]
                [-ejbjar <ejb-jar.xml_path>]
                [-jeusejbdd <jeus-ejb-dd.xml_path>]
                [-D <property=value>]
                [-property <file-name>]
                [-target <application-path>]
                [-j concurrency-level]
                [-ejbonly]
                [-genjavaonly]
                [-webonly]
  • 파라미터

    파라미터 설명

    [-h]

    appcompiler의 도움말을 출력한다.

    [-verbose]

    verbose 모드를 설정하여 상세한 과정을 출력한다(로그 레벨을 FINEST로 설정한다).

    [-clp]

    컴파일 과정에서 필요한 라이브러리를 class path로 등록한다. 파일 또는 디렉터리 모두 올 수 있으며 각각을 구분할 때 Windows는 세미콜론( ; ), Unix는 콜론( : )을 쓰도록 한다.

    [-keep]

    컴파일 과정에서 생성된 소스를 유지할 것인지를 설정한다.

    [-jspmap]

    servlet-mapping table(jeus_jspmap.xml)을 생성할 것인지를 설정한다. 단, 이 옵션을 사용할 경우에는 JSP 파일이 있는 디렉터리 이름에 Java 예약어(예:. if, enum, class 등)가 있으면 안 된다.

    [-batch]

    모든 파일을 생성한 후 한 번에 컴파일하는 Batch 모드로 동작한다.이 옵션이 없으면 하나의 파일을 생성한 후 컴파일하는 Each 모드로 동작한다. 이 옵션은 EJB 2.x 모듈에만 적용된다.

    [-q]

    여러 모듈들을 포함한 EAR 애플리케이션을 컴파일할 때 특정 웹 모듈 컴파일을 실패할 경우 남은 다른 모듈들을 컴파일하지 않고 에러 메시지를 출력하고 중단한다.

    이 옵션이 없을 경우에는 특정 웹 모듈 컴파일을 실패해도 에러 메시지만 출력하고 남은 다른 모듈들에 대해 컴파일을 진행한다.

    [-client <clientview_filename>]

    생성될 Stub 클래스들과 인터페이스 클래스들이 포함될 clientview 파일의 이름을 설정한다.

    • <clientview_filename>은 EJB archived 파일 형식인 JAR만 지원하며, 컴파일하는 대상(archived or exploded application)이 존재하는 디렉터리에 생성된다. 이 옵션은 standalone EJB 모듈과 EJB 모듈을 가지고 있는 EAR 애플리케이션에만 적용된다.

    • <clientview_filename>은 <application_file_or_directory_name>과 동일한 경우에는 지원하지 않는다.

    • <clientview_filename>과 동일한 이름의 파일이 존재할 경우 clientview를 위한 인터페이스 클래스와 생성된 Stub 클래스를 이미 존재하는 동일한 이름의 파일에 포함시킨다. clientview 파일은 서버에 설치된 EJB를 이용하는 클라이언트 애플리케이션을 개발하기 위해 클라이언트에게 제공한다.

    [-noaddfile]

    [-client] 옵션과 함께 사용할 때 유효하며, clientview 파일을 생성하지만, 컴파일 대상이 되는 파일은 컴파일하지 않고 원본 내용을 유지한다.

    예를 들어 calc.jar를 appcompiler로 수행할 때 clientview 파일을 생성하기 위해서 [-client] 옵션을 사용한다. 여기서 clientview 파일은 Stub과 Remote, Home 인터페이스 클래스들만 모아둔 파일을 의미한다. 이때 calc.jar를 appcompiler로 컴파일한 뒤 clientview 파일을 생성하기 때문에 calc.jar를 컴파일한다. 컴파일된 파일은 원본 파일에서 컴파일 과정을 통해 생성된 Impl, Skeleton, Stub 등 클래스 파일들이 추가되어 있다. 만약 사용자가 calc.jar 파일 자체는 컴파일된 상태로 만들기를 원하지 않고, clientview 파일만 생성하기를 원할 경우에 [-noaddfile] 옵션을 사용할 수 있다.

    [-deloldgen]

    EJB 모듈을 컴파일할 때 JEUS 이전 버전에서 만들어진 Impl, Skeleton, Stub 파일들을 삭제하고 컴파일을 시도한다.

    [참고]

    JEUS 4와 JEUS 5에서 Impl, Skeleton, Stub 클래스들의 이름을 생성하는 방식이 JEUS 8 이후 버전과는 다르다. JEUS 이전 버전인 JEUS 4와 JEUS 5에서 생성한 EJB 모듈을 appcompiler로 컴파일하여 JEUS 8 이후 버전에서 사용하려고 할 때 기존 버전의 Impl, Skeleton, Stub 파일들이 남아있어 정상적으로 EJB가 수행하지 않는 문제점을 해결할 수 있다.

    [-ejbjar <ejb-jar.xml_path>]

    컴파일할 때 사용할 ejb-jar.xml 파일을 설정한다.

    [-jeusejbdd <jeus-ejb-dd.xml_path> ]

    컴파일할 때 사용할 jeus-ejb-dd.xml 파일을 설정한다.

    [-D <property=value>]

    시스템 프로퍼티를 지정한다. 이 옵션은 한 번 이상 이용할 수 있다.

    [-property <file-name>]

    파일로부터 시스템 프로퍼티를 설정한다.

    [-target <application-path>]

    컴파일할 대상 애플리케이션 파일(archived ear, jar, war) 또는 디렉터리(exploded EAR, JAR, WAR)를 설정한다.

    EAR뿐 아니라 standalone JAR, WAR도 하나의 애플리케이션으로 생각한다. 컴파일해서 생성된 Impl, Skeleton, Stub 클래스 파일들은 컴파일하는 대상 애플리케이션의 파일에 추가된다.

    [-j concurrency-level]

    JSP 컴파일할 때에 사용하는 값이다. JSP 파일들이 많은 경우 이 설정을 통해서 여러 개의 Thread로 동시에 컴파일을 진행하는 것이 효율적이다. (기본값: 1)

    [-ejbonly]

    EAR 내부에 있는 EJB 모듈만 컴파일한다.

    [-genjavaonly]

    Java 파일만을 생성하고 싶을 때에 사용한다.

    [-webonly]

    EAR 내부에 있는 Web 모듈만 컴파일한다.

  • 예제

    appcompiler는 JEUS_HOME/bin/ 디렉터리에 위치한 일반적인 스크립트 파일이다.

    • ejb.jar 모듈의 Home, Remote interface Impl, Skeleton, Stub 클래스를 생성해서 JAR 파일에 포함한다.

      JEUS_HOME/bin$ appcompiler ejb.jar
    • web.war 모듈의 모든 JSP 파일로부터 서블릿 클래스를 생성해서 WAR 파일에 포함한다.

      JEUS_HOME/bin$ appcompiler web.war
    • Batch 모드로 모듈을 컴파일한다.

      JEUS_HOME/bin$ appcompiler -batch app.jar
    • ejb.jar 모듈의 home, remote 인터페이스 Impl, Skeleton, Stub 클래스를 생성해서 ejb.jar 파일에 포함시키며 Home, Remote 인터페이스와 생성된 Stub 클래스를 포함한 clinetview.jar 파일을 생성한다.

      JEUS_HOME/bin$ appcompiler -client clientview.jar ejb.jar