네가 모 르 는 다섯 가지 일--JAR 파일(번역)

네가 모 르 는 다섯 가지--JAR 파일
이것 은 Ted Neward 가IBM developerWorks5 things 시리즈 의 한 편JAR 에 관 한 응용 요령 을 이야기 한 것 으로 여러분 이 배 울 만 한 가치 가 있 습 니 다.(2010.06.27 마지막 업데이트)요약:많은 자바 개발 자 들 은 JAR 에 대해 깊이 생각 한 적 이 없다.-그들 은 제품 서버 에 클래스 를 전달 하기 전에 JAR 로 이 파일 들 을 포장 할 뿐이다.그러나 JAR 은 이름 이 바 뀐 ZIP 파일 만 이 아니다.Spring 의존 과 프로필 설정 을 포함 한 자바 압축 파일 을 사용 하 는 모든 능력 을 배 웁 니 다.    대부분의 자바 개발 자 들 에 게 JAR 과 그의 형제들,WAR 과 EAR 는 앤 트 나 Maven 이 처리 한 최종 결과 입 니 다.하나의 표준 과정 은 JAR 을 서버 의 적응 위치(또는 더 드 물 게 사용자 의 기계 에 복사)로 복사 한 후에 그것 을 잊 어 버 리 는 것 이다.    정확히 말 하면 JAR 이 할 수 있 는 일 은 소스 코드 만 저장 하 는 것 이 아니 라 할 수 있 는 다른 일과 어떻게 사용 하 는 지 알 아야 한다.이'5 things'시리즈 의 분기 별 글 에서 소개 하 는 팁 은 대부분의 자바 압축 파일 을 만 드 는 방법(어떤 예 에 서 는 WAR 과 EAR 도 다 룰 수 있다),특히 개발 시기 에 도 보 여 준다.    많은 자바 개발 자 들 이 Spring(또한 Spring 프레임 워 크 는 우리 가 JAR 전통 응용 에 대한 도전 을 보 여 주 었 기 때 문)을 사용 하고 있 기 때문에 그 중에서 몇 가지 팁 은 특히 Spring 응용 중의 JAR 파일 을 대상 으로 하 는 것 입 니 다.    나 는 표준 자바 압축 파일 처리 의 예 로 시작 할 것 이다.이 예 는 아래 각 요령 의 기초 이다.JAR 에 넣다    일반적으로 소스 코드 를 컴 파일 한 후에 JAR 파일 을 만 들 고 jar 명령 도구 나 더 통용 되 는 Ant 의 jar 작업 을 통 해 자바 코드(이미 패키지 로 분리 되 었 음)를 하나의 파일 에 집합 합 니 다.이런 처 리 는 매우 명확 하 다.여기 서 나 는 보 여주 지 않 겠 다.그러나 본문의 뒤에 나 는 JAR 파일 이 어떻게 구 성 된 이 주제 로 돌아 갈 것 이다.현재,우 리 는 Hello 클래스 만 포장 하면 됩 니 다.이것 은 독립 적 으로 실행 되 는 콘 솔 도구 입 니 다.이 응용 프로그램 은 콘 솔 에 정 보 를 인쇄 합 니 다.이것 은 목록 1 과 같은 유용 한 작업 입 니 다.
목록 1.포장 에 사용 할 콘 솔 도구
package com.tedneward.jars;

public class Hello
{
    public static void main(String[] args)
    {
        System.out.println("Howdy!");
    }
}

 Hello 도 구 는 복잡 하지 않 지만 실행 가능 한 프로그램 으로 시작 하여 JAR 파일 을 탐색 하 는 유용 한 보조 수단 입 니 다.1.JAR 은 실행 가능    .NET 과 C++와 같은 프로 그래 밍 언어 는 역사적 으로 운영 체제 친화 적 인 장점 이 있 습 니 다.명령 줄 에 이름(hello World.exe)을 도입 하거나 GUI Shell 에서 아이콘 을 더 블 클릭 하면 이 프로그램 이 시 작 됩 니 다.그러나 자바 프로 그래 밍 에서 실행 기 프로그램 인 자바-JVM 을 실행 하도록 유도 한 후,우 리 는 명령 행 인자(com.tedneward.Hello)를 입력 하여 시작 할 main()방법 을 포함 하 는 클래스 를 지정 해 야 합 니 다.    이러한 추가 절 차 는 자바 에 사용자 친화 적 인 응용 프로그램 을 만 들 기 어렵 게 한다.최종 사용자 가 명령 줄 에 모든 요 소 를 입력 해 야 하기 때 문 만 은 아니다.    JAR 파일 을 실행 할 때 자바 실행 기 가 어떤 종 류 를 시작 하 는 지 자동 으로 알 수 있 도록 JAR 파일 을 실행 가능 하 게 하 는 것 이 솔 루 션 입 니 다.우리 가 해 야 할 일 은 JAR 파일 의 manifest(JAR 파일 META-INF 의 MENIFest.MF 파일)에 속성 을 도입 하 는 것 입 니 다.예 를 들 어 목록 2.입구 점 표시
Main-Class: com.tedneward.jars.Hello

 manifest 는 이름 값 입 니 다.mainfest 는 가끔 리 턴 과 빈 칸 에 민감 하기 때문에 JAR 을 만 들 때 Ant 를 사용 하여 이 파일 을 만 드 는 것 이 편리 하 다.목록 3 에서 저 는 Ant 의 jar 작업 에서 manifest 요 소 를 사용 하여 생 성 할 manifest:목록 3.입구 점 구축
<target name="jar" depends="build">
    <jar destfile="outapp.jar" basedir="classes">
        <manifest>
            <attribute name="Main-Class" value="com.tedneward.jars.Hello" />
        </manifest>
    </jar>
</target>

 현재 JAR 파일 을 실행 하기 위해 서 사용자 가 해 야 할 일 은 명령 행 에 파일 이름 을 지정 하 는 것 입 니 다.명령 자바-jar outapp.jar 를 통 해.이 경우 일부 GUI 셸 에서 JAR 파일 을 더 블 클릭 해도 된다.2.JAR 은 의존 정 보 를 포함 할 수 있다    Hello 도구 류 의 문자 가 확 장 된 것 같 아서 서로 다른 실현 에 대한 수요 가 매우 급 해 졌 다.Spring 이나 Guice 와 같은 의존 주입(DI)용 기 는 우리 에 게 많은 세부 사항 을 처리 해 주 었 으 나,여전히 약간의 장애 가 있다.목록 4.Hello,Spring World!
package com.tedneward.jars;

import org.springframework.context.*;
import org.springframework.context.support.*;

public class Hello
{
    public static void main(String[] args)
    {
        ApplicationContext appContext =
            new FileSystemXmlApplicationContext("./app.xml");
        ISpeak speaker = (ISpeak) appContext.getBean("speaker");
        System.out.println(speaker.sayHello());
    }
}

 실행 기-jar 옵션 은 명령 행 의-classpath 옵션 으로 덮어 쓰기 때문에 위 프로그램 을 실행 할 때 Spring 은 CLASSPATH 에 나타 나 고 환경 변수 에 있어 야 합 니 다.다행히도 JAR 은 다른 JAR 에 의존 하 는 성명 이 manfiest 에 나타 날 수 있 도록 허용 합 니 다.이것 은 당신 이 성명 할 필요 가 없 는 CLASSPATH 를 암시 적 으로 만 들 었 습 니 다.목록 5 와 같이 목록 5.Hello,Spring CLASSPATH!
<target name="jar" depends="build">
    <jar destfile="outapp.jar" basedir="classes">
        <manifest>
            <attribute name="Main-Class" value="com.tedneward.jars.Hello" />
            <attribute name="Class-Path"
                    value="./lib/org.springframework.context-3.0.1.RELEASE-A.jar
                        ./lib/org.springframework.core-3.0.1.RELEASE-A.jar
                        ./lib/org.springframework.asm-3.0.1.RELEASE-A.jar
                        ./lib/org.springframework.beans-3.0.1.RELEASE-A.jar
                        ./lib/org.springframework.expression-3.0.1.RELEASE-A.jar
                        ./lib/commons-logging-1.0.4.jar" />
            </manifest>
    </jar>
</target>

 Class-Path 속성 은 JAR 에 대한 참조 경 로 를 포함 하고 있 음 을 알 수 있 습 니 다.절대 인용 경 로 를 쓸 수도 있 고 접두사 가 전혀 필요 하지 않 을 수도 있 습 니 다.이 경우 JAR 파일 과 프로그램 에 의존 하 는 JAR 파일 이 같은 디 렉 터 리 에 있다 고 가정 해 야 합 니 다.    불 행 히 도 Ant 의 Class-Path 속성 에 대응 하 는 value 속성 은 한 줄 에 나타 나 야 합 니 다.JAR manfiest 는 여러 개의 Class-Path 속성 에 대응 할 수 없 기 때문에 모든 의존 은 manifest 파일 의 같은 줄 에 나타 나 야 합 니 다.분명 한 것 은 추 하지만 명령 자바-jar outapp.jar 를 사용 하기 위해 서 는 가치 가 있 습 니 다.3.JAR 을 암시 적 으로 참조 할 수 있 습 니 다.만약 에 여러 개의 다른 명령 행 도구(또는 다른 응용 프로그램)가 Spring 프레임 워 크 의 JAR 파일 을 사용 해 야 한다 면 이 Spring JAR 파일 을 모든 도구 류 가 참조 할 수 있 도록 공공 경로 에 두 십시오.이렇게 하면 파일 시스템 에 JAR 파일 이 가득 한 여러 개의 복사 본 을 피 할 수 있다.자바 가 실 행 될 때 환경의 공공 JAR 파일 경로,즉 여러분 이 알 고 있 는'확장 디 렉 터 리'입 니 다.기본 값 은 JRE 설치 경로 에 있 는 lib/ext 하위 디 렉 터 리 입 니 다.JRE 는 맞 춤 형 경로 이지 만 주어진 자바 환경 에서 이 경 로 를 맞 추 지 않 아 lib/ext 가 JAR 파일 을 저장 하 는 안전 한 곳 이 라 고 가정 할 수 있 습 니 다.이 디 렉 터 리 의 JAR 파일 은 자바 가 실 행 될 때 환경의 CLASSPATH 에 기본적으로 나타 납 니 다.4.자바 6 허용 클래스 어댑터    거대 한 CLASSPATH 환경 변 수 를 피 하려 는 노력 으로 자바 6 은 클래스 경로 어댑터 옵션 을 도입 했다.시작 할 때 하나의 인자 에 모든 JAR 파일 을 표시 해 야 하 는 것 과 달리 클래스 경로 어댑터 는 lib/*를 통 해 이 디 렉 터 리 에 있 는 모든 JAR 파일 을 지정 할 수 있 습 니 다.    불 행 히 도 클래스 경로 어댑터 는 이전에 논 의 했 던 Class-Path 속성 manifest 항목 을 지원 하지 않 습 니 다.일부 개발 자 작업,예 를 들 어 코드 생 성 이나 분석 도 구 를 위해 클래스 경로 어댑터 를 사용 하면 자바 응용 프로그램(서버 포함)을 더욱 편리 하 게 시작 할 수 있 습 니 다.5.JAR 은 코드 만 포함 하 는 것 이 아 닙 니 다.    자바 생태계 의 많은 구성 부분 처럼 Spring 은 하나의 프로필 에 의존 합 니 다.이 파일 은 운영 환경 을 어떻게 구축 하 는 지 설명 합 니 다.앞에서 말 한 바 와 같이 Spring 은 app.xml 파일 에 의존 합 니 다.이 파일 은 JAR 파일 과 같은 디 렉 터 리 에 존재 하지만 개발 자 들 은 JAR 파일 옆 에 있 는 프로필 을 복사 하 는 것 을 잊 어 버 립 니 다.    sysadmin 은 일부 프로필 을 편집 하지만,많은 프로필(예 를 들 어 Hibernate 맵 파일)이 sysadmin 필드 밖 에 있어 서 발표 오류 가 발생 할 수 있 습 니 다.현명 한 해결 방안 은 코드 와 프로필 을 한데 묶 는 것 이다.이것 은 실행 가능 한 것 이다.왜냐하면 JAR 은 본질 적 으로 변 형 된 ZIP 이기 때문이다.Ant 작업 에 프로필 을 포함 하거나 jar 명령 을 사용 하여 JAR 파일 을 만 듭 니 다.    JAR 은 프로필 뿐만 아니 라 다른 형식의 파일 도 포함 할 수 있 습 니 다.예 를 들 어,만약 나의 SpeakEnglish 구성 요소 가 속성 파일 에 접근 하고 싶다 면,나 는 목록 6 처럼 설정 할 것 이다:목록 6.무 작위 응답
package com.tedneward.jars;

import java.util.*;

public class SpeakEnglish
    implements ISpeak
{
    Properties responses = new Properties();
    Random random = new Random();

    public String sayHello()
    {
        // Pick a response at random
        int which = random.nextInt(5);
        
        return responses.getProperty("response." + which);
    }
}

 responses.properties 를 JAR 파일 에 넣 는 것 은 JAR 파일 과 함께 배치 할 파일 이 너무 많 지 않다 는 것 을 의미한다.이 를 위해 서 는 JAR 을 만 드 는 과정 에서 responses.properties 파일 을 포함 시 켜 야 합 니 다.JAR 에 프로필 을 저장 하면 어떻게 얻 을 지 생각 할 수도 있다.원 하 는 데이터 가 같은 JAR 파일 에 있다 면 클래스 의 ClassLoader 에서 이 파일 을 JAR 파일 의'자원'으로 찾 을 수 있 습 니 다.ClassLoader 의 getResource AsStream()방법 을 사용 하 십시오.목록 7 참조:목록 7.ClassLoader 포 지 셔 닝 자원
package com.tedneward.jars;

import java.util.*;

public class SpeakEnglish
    implements ISpeak
{
    Properties responses = new Properties();
    // 

    public SpeakEnglish()
    {
        try
        {
            ClassLoader myCL = SpeakEnglish.class.getClassLoader();
            responses.load(
                myCL.getResourceAsStream(
                    "com/tedneward/jars/responses.properties"));
        }
        catch (Exception x)
        {
            x.printStackTrace();
        }
    }
    
    // 
}

 결론.    본 고 는 JAR 에 관 한 대부분의 자바 개발 자 들 이 가장 모 르 는 5 가지 일 을 포함 하고 있 습 니 다.적어도 역사 와 일화 증 거 를 바탕 으로 이렇게 볼 수 있 습 니 다.이 모든 JAR 관련 팁 도 WAR 에 똑 같이 적용 된다 는 점 에 유의 하 자.일부 팁(특히 Class-Path 와 Main-Class 속성)은 WAR 에 대해 정확 하지 않 습 니 다.Servlet 환경 은 디 렉 터 리 의 모든 내용 을 가 져 오고 미리 정 의 된 입구 점 이 있 기 때 문 입 니 다.그러나 종합 적 으로 보면 이런 방법 들 은 우리 로 하여 금 이러한 범례 를 뛰 어 넘 게 한다."그래,디 렉 터 리 에 있 는 모든 파일 을 복사 하 자."이 외 에 도 자바 애플 리 케 이 션 배치 가 쉬 워 졌 다.

좋은 웹페이지 즐겨찾기