실행가능한 JAR(executable jar)을 생성하게 되면 다음과 같이 META-INF 폴더 밑에 MANIFEST.MF 파일이 생성된다.

├── Application.class
└── META-INF
    └── MANIFEST.MF

MANIFEST.MF 내용

  • Manifest specification
    Manifest-Version: 1.0
    Class-Path: .
    Main-Class: Application // 실행가능한jar의 엔트리포인트가 되는 클래스명
    

예제

  • java.util.jar.JarFile API를 이용해서 Jar 파일에 대한 정보를 읽어드릴 수 있다.
  • 다음과 같이 JDK6과 JDK7에서 가져올 수 있는 부분이 다른 것으로 보인다.

    ㅡ_-);; JDK6, JDK7, JDK8에서 다를 수 있는데 그걸 테스트하기가 좀… 귀찮…

JarFile jarFile = new JarFile(/** 식별하려고 하는 jar 파일*/);

private boolean hasMainClassManifest(JarFile jarFile) throws IOException {
    Double javaVersion = Double.parseDouble(System.getProperty("java.specification.version"));
    log.debug("Java version: {}", javaVersion);
    log.debug("Has Main-Class: {}", jarFile.getManifest().getEntries().containsKey("Main-Class"));
    log.debug("Has Main-Class: {}", jarFile.getManifest().getMainAttributes().getValue("Main-Class"));
    if(1.7 > javaVersion) {
        return jarFile.getManifest().getEntries().containsKey("Main-Class");
    } else if(1.7 == javaVersion) {
        return null != jarFile.getManifest().getMainAttributes().getValue("Main-Class");
    } else {
        //TODO JDK 8 에서는 어떻게 될까?
        log.debug("Not implements");
        return false;
    }
}

대략 위의 메서드를 통해서 선택한 jar가 실행가능한 Main-Class를 가지고 있는지 여부를 확인할 수 있다.

참고


+ Recent posts