programing

뚱뚱한 JAR이 뭐죠?

goodcopy 2022. 8. 2. 23:24
반응형

뚱뚱한 JAR이 뭐죠?

나는 사람들이 뚱뚱한 JAR을 만들어 배포한다고 말하는 것을 들었다.그들은 실제로 무엇을 의미합니까?

뚱뚱한 항아리는 프로젝트가 의존하는 모든 라이브러리의 클래스와 현재 프로젝트의 클래스를 포함하는 항아리입니다.

빌드 시스템마다 Fat jar가 다르게 생성됩니다. 예를 들어 Gradle에서는 다음과 같이 (지시)를 사용하여 만듭니다.

task fatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.example.Main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

Maven에서는 (일반적인 항아리를 설치한 후) 다음과 같이 처리됩니다.

<pluginRepositories>
   <pluginRepository>
        <id>onejar-maven-plugin.googlecode.com</id>
        <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
   </pluginRepository>

<plugin>
    <groupid>org.dstovall</groupid>
    <artifactid>onejar-maven-plugin</artifactid>
    <version>1.4.4</version>
    <executions>
        <execution>
            <configuration>
                <onejarversion>0.97</onejarversion>
                <classifier>onejar</classifier>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
   </executions>
</plugin>

다른 이름들은 단지 자바 앱을 패키징하는 방법일 뿐이다.

Skinny – 코드 에디터에 문자 그대로 입력하는 비트만 포함되며 그 에는 포함되지 않습니다.

Thin – 위의 모든 것 외에 앱의 직접 종속성(DB 드라이버, 유틸리티 라이브러리 등)을 포함합니다.

Hollow – Thin의 역 – 앱 실행에 필요한 비트만 포함되며 앱 자체는 포함되지 않습니다.기본적으로 기존 Java EE 앱 서버와 동일한 스타일로 나중에 앱을 배포할 수 있는 미리 패키지화된 "앱 서버"입니다. 단, 중요한 차이점이 있습니다.

Fat/Uber – 말 그대로 사용자가 직접 쓴 비트와 의 직접적인 종속성, 그리고 앱을 "스스로" 실행하는 데 필요한 비트가 포함되어 있습니다.

출처 : Dzone 기사

JAR 유형의 시각적 표현

Fat jar 또는 uber jar는 모든 프로젝트 클래스 파일과 리소스가 포함된 항아리입니다.이러한 효과를 얻기 위한 다양한 방법이 있습니다.

  • 의존관계 jar는 메인 jar에 복사된 후 특수 클래스 로더를 사용하여 로드됩니다(onejar, spring-boot-load: repackage).
  • 의존관계 jar는 메인 jar 계층의 맨 위에서 추출됩니다(maven-assembly-dependencies 어셈블리와 함께 매핑됨).
  • 종속성의 자리는 메인 jar 계층의 맨 위에서 압축 해제되고 패키지의 이름이 변경됩니다(shadow goal이 있는 maven-harget).

다음 예제 어셈블리 플러그인 구성 jar-with-dependencies:

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <!-- NOTE: We don't need a groupId specification because the group is
             org.apache.maven.plugins ...which is assumed by default.
         -->
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <classifier
        </configuration>
        ...
</project>

자세한 설명은 다음과 같습니다.Uber-JAR(imagej.net)

실행 가능한 jar의 경우 fat jar에 대해 생각할 수 있는 또 다른 방법은 다음을 호출하여 실행할 수 있습니다.

java -jar myFatLibrary.jar

할 필요 없이-cp/--classpath또는 항아리 아이콘을 두 번 클릭할 수도 있습니다.

Fat jar는 단순히 모든 런타임 종속성의 클래식 jar + 클래스와 동일한 클래스를 포함합니다.

Jeka(https://jeka.dev)를 사용하면 프로그래밍 방식으로 실행할 수 있습니다.

JkPathTreeSet.of(Paths.get("classes")).andZips(
    Paths.get("bouncycastle-pgp-152.jar"),
    Paths.get("classgraph-4.8.41.jar"),
    Paths.get("ivy-2.4.0.jar")
).zipTo(Paths.get("fat.jar"));

또는 Java 플러그인 매개 변수를 사용하여 다음을 수행합니다.

javaPlugin.getProject().getMaker().defineMainArtifactAsFatJar(true);

그래들 문서에서

Java 공간에서는 애플리케이션과 그 종속성이 일반적으로 단일 배포 아카이브 내에서 개별 JAR로 패키지화되었습니다.이는 여전히 발생하지만, 현재 일반적인 또 다른 접근법이 있습니다. 즉, 종속성의 클래스와 리소스를 애플리케이션 JAR에 직접 배치하여 Uber 또는 Fat JAR로 알려진 것을 만드는 것입니다.

이 예증되어 있다uberJar과업build.gradle파일:

task uberJar(type: Jar) {
    archiveClassifier = 'uber'

    from sourceSets.main.output

    dependsOn configurations.runtimeClasspath
    from {
        configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
    }
}

이 경우 프로젝트의 런타임 의존성을 취합니다.configurations.runtimeClasspath.files- 각 JAR 파일에는zipTree()방법.그 결과 ZIP 파일 트리의 집합이 생성되고, 그 내용은 애플리케이션 클래스와 함께 uber JAR에 복사됩니다.

언급URL : https://stackoverflow.com/questions/19150811/what-is-a-fat-jar

반응형