JAR 씨 가 모 르 는 5 가지 에 대해 서.
사실 JAR 이 할 수 있 는 일 은 메모리 소스 코드 뿐만 아니 라 JAR 이 무엇 을 할 수 있 는 지,어떻게 진행 할 수 있 는 지 알 아야 합 니 다.이번 호의 5 가지 시리즈 에 서 는 자바 아 카 이브 파일(때로는 WAR 과 EAR)을 최대한 활용 하 는 방법 을 보 여 드 리 겠 습 니 다.특히 배치 할 때.
많은 자바 개발 자 들 이 Spring(Spring 프레임 워 크 가 전통 적 인 JAR 사용 에 특유 의 도전 을 가 져 왔 기 때 문)을 사용 하기 때문에 Spring 응용 프로그램 에서 JAR 을 처리 하 는 구체 적 인 기술 이 몇 가지 있 습 니 다.
본 시리즈 에 대하 여
자바 프로 그래 밍 을 안다 고 생각 하 십 니까?사실은 대부분의 개발 자 들 은 자바 플랫폼 의 피상 적 인 것 만 깨 달 았 고 배 운 것 도 업무 에 대처 할 수 밖 에 없 었 다.본 계열 에서 Ted Neward 는 자바 플랫폼 의 핵심 기능 을 깊이 발굴 하여 잘 알려 지지 않 은 사실 을 밝 히 고 가장 까다 로 운 프로 그래 밍 어려움 을 해결 하 는 데 도움 을 줍 니 다.
나 는 표준 자바 아 카 이브 파일 생 성 과정의 간단 한 예제 로 시작 할 것 이다.이것 은 다음 과 같은 기술 의 기초 가 될 것 이다.
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++와 같은 언어 는 OS 에 우호 적 이 며 명령 행(
helloWorld.exe
)에서 이름 을 참조 하거나 GUI 셸 에서 아이콘 을 두 번 누 르 면 프로그램 을 시작 할 수 있 습 니 다.그러나 자바 프로 그래 밍 에서 실행 기 프로그램 인 java
-JVM 을 프로 세 스 로 유도 하려 면 명령 행 인자(com.tedneward.Hello
)가 시작 하고 자 하 는 main()
방법 을 지정 하 는 클래스 를 전달 해 야 합 니 다.이러한 추가 절 차 는 자바 로 인터페이스 가 좋 은 프로그램 을 만 드 는 것 을 더욱 어렵 게 한다.터미널 사용 자 는 명령 행 에 모든 인 자 를 입력 해 야 할 뿐만 아니 라 그 나 그녀 가 실 수 를 하고 이해 하기 어 려 운 오 류 를 되 돌려 줄 수도 있다.
이 솔 루 션 은 JAR 파일 을 실행 가능 하 게 하여 자바 시작 프로그램 이 JAR 파일 을 실행 할 때 어떤 종류 가 시 작 될 지 자동 으로 식별 합 니 다.우리 가 해 야 할 일 은 하나의 입 구 를 JAR 파일 목록 파일(
MANIFEST.MF
JAR 의 META-INF
서브 디 렉 터 리 아래)에 도입 하 는 것 입 니 다.이렇게:리스트 2.입구 점 보 여주 기!
Main-Class: com.tedneward.jars.Hello
이 목록 파일 은 이름 값 만 맞습니다.목록 파일 이 리 턴 과 빈 칸 을 처리 하기 어 려 울 때 도 있 지만,JAR 을 구축 할 때 Ant 를 사용 해 목록 파일 을 만 드 는 것 은 쉽 기 때문이다.목록 3 에서 Ant
jar
작업 의 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 파일 을 실행 할 때 해 야 할 일 은
java -jar outapp.jar
을 통 해 명령 행 에 파일 이름 을 지정 하 는 것 입 니 다.GUI 셸 의 경우 JAR 파일 을 더 블 클릭 하면 된다.페이지 맨 위
2.JAR 은 의존 관계 정 보 를 포함 할 수 있다.
Hello
유 틸 리 티 도구 가 전 개 된 것 처럼 실현 을 바 꾸 는 수요 가 나 타 났 다.Spring 또는 Guice 와 같은 의존 항 주입(DI)용 기 는 많은 세부 사항 을 처리 할 수 있 지만 작은 문제 가 있 습 니 다.코드 를 수정 하여 DI 용 기 를 포함 하 는 용법 은 목록 4 의 결 과 를 초래 할 수 있 습 니 다.예 를 들 어:목록 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());
}
}
Spring 에 대한 더 많은 정보
이 기술 은 의존 항 주입 과 Spring 프레임 워 크 를 익히 는 데 도움 이 될 것 입 니 다.다른 주 제 를 복습 할 필요 가 있다 면 참고 자료 을 보십시오.
프로그램 을 시작 하 는
-jar
옵션 은 -classpath
명령 행 옵션 의 모든 내용 을 덮어 쓰기 때문에 이 코드 를 실행 할 때 Spring 은 CLASSPATH
과 환경 변수 에 있어 야 합 니 다.다행스럽게도 JAR 은 목록 파일 에 다른 JAR 의존 성명 이 나타 날 수 있 도록 허용 하여 성명 없 이 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>
프로그램 이 의존 하 는 JAR 파일 과 관련 된 인용 을 포함 하 는
Class-Path
속성 을 주의 하 십시오.절대 인용 이나 접두사 가 전혀 없 는 것 으로 쓸 수 있 습 니 다.이 경우 JAR 파일 과 응용 프로그램 JAR 이 같은 디 렉 터 리 에 있다 고 가정 합 니 다.불 행 히 도
value
속성 과 Ant Class-Path
속성 은 같은 줄 에 나타 나 야 합 니 다.JAR 목록 파일 은 여러 개의 Class-Path
속성 을 처리 할 수 없 기 때 문 입 니 다.따라서 이 모든 의존 항목 은 목록 파일 에 한 줄 에 있어 야 합 니 다.물론 보기 싫 지만 java -jar outapp.jar
을 사용 하기 위해 서 는 가치 가 있 습 니 다!페이지 맨 위
3.JAR 은 암시 적 으로 인 용 될 수 있다.
스프링 프레임 워 크 를 사용 하 는 명령 행 유 틸 리 티 도구(또는 다른 프로그램)가 몇 개 있 으 면 모든 유 틸 리 티 도 구 를 참조 할 수 있 도록 스프링 JAR 파일 을 공공 위치 에 두 기 쉬 울 수 있 습 니 다.이렇게 하면 파일 시스템 곳곳에 JAR 복사 본 이 있 는 것 을 피 할 수 있다.자바 가 실 행 될 때 JAR 의 공공 위 치 는'확장 디 렉 터 리'로 알려 져 있 으 며,기본 값 은
lib/ext
하위 디 렉 터 리 로 JRE 의 설치 위치 아래 에 있 습 니 다.JRE 는 맞 춤 형 위치 이지 만 주어진 자바 환경 에서 맞 춤 형 제작 이 매우 적어 서
lib/ext
이 JAR 을 저장 하 는 안전 한 곳 이 라 고 가정 할 수 있 고 이들 은 자바 환경의 CLASSPATH
에 암시 적 으로 사용 할 수 있다.페이지 맨 위
4.자바 6 허용 클래스 경로 어댑터
방대 한
CLASSPATH
환경 변수(자바 개발 자가 몇 년 전에 버 려 야 했 던)와/또는 명령 행 -classpath
인 자 를 피하 기 위해 자바 6 은 클래스 경로 어댑터 의 개념 을 도입 했다.매개 변수 에 명 시 된 모든 JAR 파일 을 시작 해 야 하기 보 다 는 lib/*
을 지정 하여 모든 JAR 파일 을 이 디 렉 터 리 아래(재 귀적 하지 않 음)클래스 경로 에 배열 하도록 하 는 것 이 좋 습 니 다.불 행 히 도 클래스 경로 어댑터 는 앞서 언급 한
Class-Path
속성 목록 입구 에 적용 되 지 않 습 니 다.그러나 이 로 인해 자바 응용 프로그램(서버 포함)개발 자 작업,예 를 들 어 code-gen 도구 나 분석 도 구 를 쉽게 시작 할 수 있 습 니 다.페이지 맨 위
5.JAR 은 코드 뿐만 아니 라
Spring,많은 자바 생태계 처럼 구축 환경 을 설명 하 는 프로필 에 의존 합 니 다.앞에서 언급 했 듯 이 Spring 은 하나의 app.xml 파일 에 의존 합 니 다.이 파일 은 JAR 파일 과 같은 디 렉 터 리 에 있 습 니 다.그러나 개발 자 들 은 JAR 파일 을 복사 하 는 동시에 배치 파일 을 복사 하 는 것 을 잊 어 버 리 는 것 은 매우 흔 합 니 다!
일부 프로필 은 sysadmin 으로 편집 할 수 있 지만,그 중 상당 부분(예 를 들 어 Hibernate 맵)은 sysadmin 필드 밖 에 있 기 때문에 배치 에 구멍 이 생 길 수 있 습 니 다.JAR 은 근본적으로'변 장 된'ZIP 파일 이기 때문에 합 리 적 인 해결 방안 입 니 다.JAR 을 구축 할 때 Ant 작업 이나
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 파일 과 같은 위치 에 있다 면 앞의 예 에서 언급 한 바 와 같이 JAR 파일 의 위 치 를 찾 는 데 신경 쓰 지 않 고
JarFile
대상 을 사용 하면 열 수 있다.반면 클래스 의 ClassLoader
을 사용 하여 찾 을 수 있 습 니 다.JAR 파일 에서'자원'을 찾 는 것 처럼 ClassLoader getResourceAsStream()
방법 을 사용 할 수 있 습 니 다.목록 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 에 묶 여
InputStream
으로 가 져 오고(ClassLoader
을 통 해)원 하 는 방식 으로 사용 할 수 있 습 니 다.페이지 맨 위
종결 어
본 고 는 JAR 대부분의 개발 자 들 이 모 르 는 가장 중요 한 5 가지 일-적어도 역 사 를 바탕 으로 조사 할 만 한 근거 가 있다.주의 하 세 요.모든 JAR 관련 기 교 는 WAR 에 도 사용 할 수 있 습 니 다.일부 기술(특히
Class-Path
과 Main-Class
속성)은 WAR 에 있어 그리 뛰 어 나 지 않 습 니 다.servlet 환경 은 모든 디 렉 터 리 가 필요 하고 미리 정 해진 입구 점 이 있어 야 하기 때 문 입 니 다.그러나 전체적으로 보면 이런 기 교 는 우 리 를'좋 습 니 다.이 디 렉 터 리 에서......................................................................이 시리즈 의 다음 주 제 는 자바 응용 프로그램의 성능 감시 에 대해 모 르 는 5 가지 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.