느슨한 애플리케이션

느슨한 애플리케이션은 XML 파일을 통해 런타임에 제공되는 여러 실제 위치에서 작성되는 애플리케이션입니다. 느슨한 애플리케이션은 Java™ EE 및 OSGi 애플리케이션에 대해 지원되며 개발 환경에서 특히 유익합니다.

일반 애플리케이션

일반적으로 애플리케이션은 하나의 디렉토리(또는 아카이브) 내의 알려진 위치에 있는 해당 컨텐츠, 모듈, 자원, 클래스 데이터 및 메타데이터와 함께 해당 디렉토리(또는 아카이브) 아래에 포함되어 있습니다. 예를 들어, 웹 애플리케이션에 대한 자원의 위치는 다음과 같습니다.
  • Library JAR(Java Archive) 파일은 WEB-INF/lib에 저장됨
  • 클래스는 라이브러리 JAR 파일 또는 WEB-INF/classes에 있음
  • 배치 디스크립터는 WEB-INF/web.xml에 있음
  • 제공될 컨텐츠는 디렉토리의 루트로부터 찾을 수 있음

느슨한 애플리케이션

느슨한 애플리케이션은 "애플리케이션을 나타내는 가상 디렉토리(정보는 임의의 위치에 있음)"로 설명됩니다. 이는 개발 도구(예: WebSphere® Application Server 개발자 도구)가 내보내기가 실행되는 대신 연관된 파일이 작업공간에서 직접 로드되는 애플리케이션을 실행할 수 있도록 합니다. 연관된 파일의 예로는 Java 클래스, JavaServer Pages 또는 이미지가 있습니다. 연관된 파일을 작업공간에서 직접 로드하면 빌드-실행-디버깅 주기가 더 빨라집니다. 컨텐츠는 하나의 디렉토리 아래에 있지 않고 다른 위치에서 제공될 수 있습니다. 이 위치는 XML 구성 파일에서 지정됩니다.

다음 두 가지 방법으로 XML 파일을 런타임에 제공할 수 있습니다.
  1. .xml 접미부를 추가하여 애플리케이션 구성 요소의 location 속성에 XML 파일 배치
  2. 애플리케이션 dropins 폴더에 직접 XML 파일 배치
예를 들어, <application location="myapp.war" />를 지정하면 런타임에서는 myapp.war.xml이라는 파일을 찾습니다. 검색 규칙은 애플리케이션 디렉토리 또는 아카이브의 경우와 동일합니다. 애플리케이션 파일과 .xml 느슨한 애플리케이션 구성 파일이 모두 있으면 느슨한 애플리케이션 구성 파일이 무시됩니다. 예를 들어, myapp.warmyapp.war.xml이 있는 경우 Liberty 서버는 myapp.war을 사용하여 애플리케이션을 실행합니다. 느슨한 애플리케이션을 dropins 폴더에 직접 배치할 수도 있습니다. dropins 폴더를 사용하려면 해당 폴더에 대해 정의되는 이름 지정 규칙을 따르고 .xml을 파일 이름의 끝에 추가하십시오.

느슨한 애플리케이션 구성 파일

Liberty 서버는 루트 디렉토리 또는 단일 아카이브에서 애플리케이션 컨텐츠를 찾는 대신 느슨한 애플리케이션 구성 파일을 사용하여 애플리케이션 컨텐츠를 얻습니다. 적절한 XML을 사용하여 다음과 같은 조치를 취할 수 있습니다.
  • 애플리케이션 내 임의의 위치에 실제 디렉토리 맵핑
  • 애플리케이션 내 임의의 위치에 실제 파일 맵핑
  • 실제 JAR 파일 또는 디렉토리를 중첩 아카이브로 임의의 위치에 맵핑
  • 여러 실제 소스를 단일 대상 위치에 맵핑(병합)
예를 들어 다음과 같습니다.
  1. 아카이브의 루트를 디스크의 한 위치(예: Eclipse 프로젝트의 폴더)에 맵핑합니다.
  2. "일반적인" 위치에 있지 않은 Java bin/output 폴더를 WEB-INF/classes 폴더에 맵핑합니다. 작업공간 환경 설정, 회사 지침, 소스 제어 프로젝트 레이아웃 지침 등으로 인해 이 위치는 다른 폴더에 있습니다. 동일한 프로젝트에 여러 Java 소스 및 출력 위치를 가지고 있을 때 두 위치를 모두 WEB-INF/classes에 맵핑할 수 있습니다.
  3. "외부" JAR 파일을 애플리케이션에 맵핑합니다. 이 "외부" JAR 파일은 다음 중 하나입니다.
    • WEB-INF/lib에서 JAR 파일처럼 처리할 별도의 Java 프로젝트
    • .war 파일을 빌드했고 런타임 시 WEB-INF/lib에 포함해야 하는 하드 디스크 드라이브의 임의의 위치에 있는 유틸리티 JAR 파일

느슨한 애플리케이션 구성 파일 예

느슨한 애플리케이션 구성 파일에서 세 가지 다른 요소를 구성할 수 있습니다.
  • <archive>(아카이브의 경우)
  • <file>(파일의 경우)
  • <dir>(디렉토리의 경우)
아카이브
<archive> 요소는 항상 느슨한 애플리케이션 구성 파일의 루트로 사용됩니다. 이 요소는 XML로 표시되는 가상 파일 시스템의 루트이기도 합니다. 세 요소를 루트 <archive> 요소 아래에서 중첩시킬 수 있습니다. 루트 <archive> 요소에는 속성이 없습니다.
아카이브 요소는 반복적으로 중첩될 수 있습니다. 루트 <archive> 요소 아래에서 중첩된 <archive> 요소의 경우 targetInArchive 속성을 설정할 수 있습니다. targetInArchive 속성은 느슨하게 정의된 엔클로징 아카이브에서 아카이브가 표시되는 경로를 정의합니다. 파일 시스템의 아카이브는 <archive> 요소를 가진 애플리케이션의 아카이브로 맵핑할 수 없습니다. 느슨한 애플리케이션 구성을 사용하여 디스크의 아카이브를 맵핑하려면 <file> 요소를 대신 사용하십시오.
참고: targetInArchive 속성 값은 선행 슬래시(/)가 있는 절대 경로입니다.
다음 코드는 다른 <archive> 요소가 아래에 중첩되어 있는 루트 <archive> 요소의 예입니다.
<archive>
    <archive targetInArchive="/jarName.jar">
        <!-- more objects can be embedded here-->
    </archive>
</archive>
파일
<file> 요소를 사용하여 하드 디스크의 파일을 느슨한 애플리케이션 구성의 파일에 맵핑할 수 있습니다. <file> 요소에서 다음과 같은 속성을 설정할 수 있습니다.
  • targetInArchive는 느슨하게 정의된 엔클로징 아카이브에서 아카이브가 표시되는 경로를 정의합니다.
  • sourceOnDisk는 파일 시스템에서 파일의 실제 위치를 정의합니다.
    참고: sourceOnDisk 속성 값은 절대 위치입니다. Liberty 변수(예: ${example.dir})를 사용할 수 있으며 이 변수는 올바르게 분석됩니다.
다음 코드는 느슨한 애플리케이션 구성에 의해 /apps/webApplication.war로 표시되는 C:/devFolder/myApplication.zip에 있는 파일의 예입니다.
<file targetInArchive="/apps/webApplication.war" 
        sourceOnDisk="C:/devFolder/myApplication.zip" />
다음 코드는 경로 /apps/webApplication.war에서 아카이브를 정의하는 엔클로징 아카이브의 예입니다. 이 아카이브에서 webApplication.war은 경로 /applications/myApplications에서 jarName.jar 파일을 정의합니다. 실제 파일 위치는 c:\devFolder\myApplication.zip입니다.
<archive targetInArchive="/apps/webApplication.war">
    <file targetInArchive="/applications/myApplications/jarName.jar" 
            sourceOnDisk="C:/devFolder/myApplication.zip" />
</archive>
디렉토리
<dir> 요소를 사용하여 디렉토리와 디스크에 있는 모든 해당 컨텐츠를 느슨한 애플리케이션 구성의 디렉토리 위치에 맵핑할 수 있습니다. 이 요소는 <file> 요소와 동일한 속성을 가지고 있으며 비슷한 방식으로 사용할 수 있습니다.
다음 코드는 느슨한 애플리케이션 구성이 /META-INF 및 파일 시스템의 ${example.dir}/applicationData/myApplication에 있는 것으로 표시하는 디렉토리의 예입니다.
<dir targetInArchive="/META-INF" 
       sourceOnDisk="${example.dir}/applicationData/myApplication" />
/apps/jarName.jar/META-INF에 있는 것으로 표시되도록 디렉토리를 아카이브에 추가하려면 다음과 같이 <dir> 요소를 임베드하십시오.
<archive targetInArchive="/apps/jarName.jar">
    <dir targetInArchive="/META-INF" 
           sourceOnDisk="${example.dir}/applicationData/myApplication" />
</archive>
이전의 두 예제 모두에서 ${example.dir}/applicationData/myApplication에 있는 모든 파일은 targetInArchive 속성에 의해 맵핑되는 디렉토리 아래의 느슨한 애플리케이션 구성에서 맵핑되고 표시됩니다.

가상 경로 및 파일 이름

<file> 또는 <dir> 요소를 아카이브에 추가하는 경우에는 느슨한 아카이브에 있는 파일 또는 디렉토리의 이름이 디스크에서의 실제 이름과 동일하지 않아도 됩니다.

다음 코드는 아카이브에서 /application.txt로 표시되도록 ${example.dir}/applicationFiles/newfile.txt를 구성하는 방법에 대한 예제입니다.
<archive>
    <file targetInArchive="/application.txt"
            sourceOnDisk="${example.dir}/applicationFiles/newfile.txt"/>
</archive>

추가된 파일 또는 디렉토리의 경로에도 동일한 개념이 적용됩니다. 디스크의 실제 자원은 선언 중인 자원에 해당하는 디렉토리 계층 구조에 있지 않아도 됩니다.

다음 코드는 ${example.dir}/applicationFiles/newfile.txt를 아카이브에서 /only/available/in/application.txt로 표시하는 방법에 대한 예제입니다.
<archive>
    <file targetInArchive="/only/available/in/application.txt" 
            sourceOnDisk=""${example.dir}/applicationFiles/newfile.txt"/>
</archive>
각각의 경우에 Liberty 서버는 targetInArchive 속성에 의해 선언된 이름 및 경로별로 자원을 확인합니다. Liberty 서버는 이전 예제와 같이 선언된 디렉토리 계층 구조에 가상 요소만 포함되어 있는 경우에도 해당 계층 구조를 탐색할 수 있습니다.
<archive>
    <file targetInArchive="/only/available/in/red.txt" 
            sourceOnDisk="${example.dir}/applicationFiles/newfile.txt" />
    <archive targetInArchive="/apps/jarName.jar">
        <dir targetInArchive="/META-INF" 
               sourceOnDisk="${example.dir}/applicationData/myApplication" />
    </arhive>
</archive>

동일한 이름을 가진 폴더와 파일

느슨한 애플리케이션 구성에서 동일한 가상 위치에 동일한 이름을 가진 두 개의 폴더가 있는 경우 해당 폴더는 병합되며 두 폴더 모두의 컨텐츠를 사용할 수 있습니다. 느슨한 아카이브에 동일한 대상 위치를 가진 두 개의 파일이 있는 경우에는 처음 발생한 파일이 사용됩니다. 첫 번째 발생은 하향식 접근 방식을 기반으로 느슨한 애플리케이션 구성 파일의 요소를 읽습니다.

발견된 첫 번째 파일이 잘못된 파일인 경우에는 원하는 파일의 버전이 포함된 요소가 먼저 처리되도록 XML을 다시 정렬하십시오. 첫 번째 발생은 <dir> 요소에서 정의된 파일과 <file> 요소에서 정의되는 파일에 적용됩니다. 동일한 이름 및 가상 위치를 가진 파일의 첫 번째 발생은 가상 파일 시스템에서 리턴되는 파일입니다.

느슨한 애플리케이션에 대한 고려사항

느슨하게 구성된 모든 애플리케이션에 대해 파일은 선언되어 있는 계층 구조의 디스크에 있지 않습니다. 애플리케이션이 자체 자원에 직접 액세스하며 펼쳐진 war 또는 ear 레이아웃의 경우와 마찬가지로 디스크에서 해당 자원이 배열될 것으로 예상하는 경우 애플리케이션은 예상치 않은 동작을 표시합니다.

애플리케이션에서 ServletContext.getRealPath를 사용하여 실제 자원 경로를 발견할 수 있습니다. ServletContext.getRealPath는 데이터를 읽거나 쓰기 위해 열 파일 경로를 발견하고 디렉토리를 얻을 수 있습니다. 하지만 웹 애플리케이션에서 ServletContext.getRealPath를 사용하여 "/"에 대한 경로를 얻는 경우에는 이 경로를 사용하여 디스크에서 애플리케이션을 탐색할 수 없습니다.

ServletContext.getRealPath를 사용하면 단일 실제 경로만 리턴되며 느슨한 애플리케이션은 애플리케이션에 표시되는 하나의 경로를 형성하기 위해 여러 디렉토리를 병합했을 수 있습니다.

다음 구성을 고려하십시오.
<archive>
    <dir targetInArchive="/" 
           sourceOnDisk="c:\myapplication" />
    <dir targetInArchive="/web/pages" 
           sourceOnDisk="c:\webpagesforapplication" />
</archive>

/web/pages에 직접 액세스한 후 디렉토리 계층 구조를 위로 탐색하는 애플리케이션은 /web/pages의 실제 경로의 상위가 /web이 아니라 c:\라는 것을 파악합니다. c:\에는 페이지 디렉토리와 상위 디렉토리가 없습니다.

이 고려사항은 애플리케이션이 디스크의 컨텐츠에 직접 액세스하고 디스크에서 해당 계층 구조 레이아웃의 가정을 기반으로 자체 경로 탐색을 수행하는 경우에만 적용됩니다. 동일한 애플리케이션이 하나의 아카이브로 배치되는 경우에는 동일한 애플리케이션에도 문제가 발생합니다. 이 애플리케이션에는 일반적으로 이식성에 대한 문제가 발생합니다.

복잡한 예제

다음 코드는 느슨한 애플리케이션 구성의 더 복잡한 예제입니다. 이 예제에서는 모든 요소를 사용하며 파일 및 디렉토리의 복잡한 맵핑을 작성합니다.
<archive>
    <dir targetInArchive="/appResources" 
           sourceOnDisk="${example.dir}/applicationFiles" />
    <archive targetInArchive="application.jar">
        <dir targetInArchive="/src" 
               sourceOnDisk="${example.dir}/applicationCode/src" />
    </archive>
    <archive targetInArchive="webApp.war">
        <dir targetInArchive="/META-INF" 
               sourceOnDisk="${example.dir}/manifestFiles/" />
        <dir targetInArchive="/WEB-INF" 
               sourceOnDisk="c:/myWorkspace/webAppProject/web-inf" />
        <archive targetInArchive="/WEB-INF/lib/myUtility.jar">
            <dir targetInArchive="/" 
                   sourceOnDisk="c:/myWorkspace/myUtilityProject/src" />
            <file targetInArchive="/someJar.jar" 
                    sourceOnDisk="c:/myWorkspace/myUtilityProject/aJar.jar" />
        </archive>
    </archive>
    <file targetInArchive="/myjar.jar" 
            sourceOnDisk="${example.dir}/apps/application.zip" />
</archive>

주제의 유형을 표시하는 아이콘 참조 주제



시간소인 아이콘 마지막 업데이트 날짜: Monday, 5 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=rwlp_loose_applications
파일 이름: rwlp_loose_applications.html