Gradle을 사용하여 실행 가능한 JAR 생성
지금까지는 Eclipse "Export.."를 통해 실행 가능한 JAR 파일을 만들었습니다.." 기능성. 하지만 빌드 자동화를 위해 IntelliJ IDEA와 Gradle로 전환했습니다.
이 문서의 일부에서는 "어플리케이션" 플러그인을 제안하고 있습니다만, 이 플러그인이 기대했던 대로의 결과는 아닙니다(JAR, 기동 스크립트 등은 없습니다).
Eclipse가 "내보내기"와 같은 결과를 얻으려면 어떻게 해야 합니까?"대화상자?
실행 가능한 jar 파일은 매니페스트에 Main-Class 엔트리가 포함된 jar 파일입니다.따라서 jar 작업을 설정하면 매니페스트에 다음 엔트리를 추가할 수 있습니다.
jar {
manifest {
attributes 'Main-Class': 'com.foo.bar.MainClass'
}
}
매니페스트에 클래스 패스엔트리를 추가해야 할 수도 있지만 같은 방법으로 할 수도 있습니다.
http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html 를 참조해 주세요.
JB Nizet과 Jorge_B의 답변은 모두 정확합니다.
가장 간단한 형태에서 Gradle을 사용하여 실행 가능한 JAR을 작성하는 것은 매니페스트에 적절한 엔트리를 추가하는 것만으로 충분합니다.그러나 클래스 패스에 포함할 필요가 있는 의존관계가 있는 경우가 훨씬 더 많기 때문에 실제로 이 접근방식은 까다롭습니다.
응용 프로그램플러그인은 실행 가능한 JAR을 작성하는 대신 다음 기능을 제공합니다.
- a
run
로부터 을 직접 할 수 하기 위한 - 한 사람
installDist
JAR, 에 의존하는 및 이 할 수 있는 하는 스타트업 ) distZip
★★★★★★★★★★★★★★★★★」distTar
와 JAR
세 번째 접근법은 컴포넌트의 코드뿐만 아니라 모든 종속성을 포함하는 실행 가능한 JAR인 이른바 "팻 JAR"를 작성하는 것입니다.이 접근방식을 사용하는 플러그인은 몇 가지 있습니다.제가 알고 있는 몇 개의 링크를 포함했습니다.더 있을 겁니다.
jar 가 ada의 jar에 되어 있어야 .Main-Class
이치노되어 않은 는, 「」로 .Class-Path
이치노
실행 가능한 jar를 만들고 어떤 식으로든 의존관계를 포함하는 간단한 작업을 위해 모든 종류의 플러그인 조합을 시도해 보았습니다.모든 플러그인이 어떻게든 부족한 것 같지만, 마침내 원하는 대로 손에 넣었습니다.빌드 디렉토리를 오염시키는 수백만 개의 미니 파일, 매우 깨끗한 빌드 스크립트 파일, 그리고 무엇보다도 백만 개의 외부 서드파티 클래스 파일이 제 jar 아카이브에 병합되지 않았습니다.
다음은 고객님의 편의를 위해 복사 붙여넣기입니다.
[를 가진 /lib
.Class-Path
「CHANGE MANGE:」
apply plugin: 'java'
apply plugin: 'java-library-distribution'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.3.2'
}
// Task "distZip" added by plugin "java-library-distribution":
distZip.shouldRunAfter(build)
jar {
// Keep jar clean:
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
manifest {
attributes 'Main-Class': 'com.somepackage.MainClass',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
}
// How-to add class path:
// https://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle
// https://gist.github.com/simon04/6865179
}
여기서 요지로 진행됩니다.
는 을 참조해 주십시오.build/distributions
압축 해제된 내용은 다음과 같습니다.
.3.2. lib/syslog-syslog3-3jar
MyJarFile.jar
★★의 내용MyJarFile.jar#META-INF/MANIFEST.mf
:
1.0
com. some package (일부 패키지) Class 인 main main main main main
패스: lib: lib/commons-lang3-3.3.2.jar
가장 힘들지 않은 해결책은 그래들-섀도-플러그인을 사용하는 것이다.
플러그인 적용 외에 필요한 작업은 다음과 같습니다.
기본 클래스를 매니페스트에 포함하도록 jar 작업을 구성합니다.
jar {
manifest {
attributes 'Main-Class': 'com.my.app.Main'
}
}
그래들 태스크 실행
./gradlew shadowJar
build/libs/에서 app-version-all.jar를 가져옵니다.
마지막으로 다음을 통해 실행:
java -jar app-version-all.jar
SpringBoot 플러그인을 사용할 수 있습니다.
plugins {
id "org.springframework.boot" version "2.2.2.RELEASE"
}
항아리를 만듭니다.
gradle assemble
그리고 나서 실행한다.
java -jar build/libs/*.jar
주의: 이 플러그인을 사용하기 위해 프로젝트가 SpringBoot 프로젝트일 필요는 없습니다.
'install App' 작업을 시도해 보셨습니까?일련의 시작 스크립트가 있는 완전한 디렉토리가 작성되지 않습니까?
http://www.gradle.org/docs/current/userguide/application_plugin.html
콘스탄틴, 고마워. 별 뉘앙스 없이 잘 먹혔어.어떤 이유에서인지 jar 매니페스트의 일부로 main 클래스를 지정하는 것은 제대로 작동하지 않았고 대신 mainClassName 속성이 필요했습니다.build.gradle의 일부를 소개합니다.이것에는, 동작하기 위한 모든 것이 포함되어 있습니다.
plugins {
id 'java'
id 'com.github.johnrengelman.shadow' version '1.2.2'
}
...
...
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
...
...
mainClassName = 'com.acme.myapp.MyClassMain'
...
...
...
shadowJar {
baseName = 'myapp'
}
gradle shadowJar를 실행하면 빌드 폴더에 java - jar myapp-{version}-all.jar가 표시됩니다.
이것은 Kotlin DSL(build.gradle.kts)용입니다.
1(「」1(「」)은 )application
★★★★★★★★★★★★★★★★★」
tasks.jar {
manifest.attributes["Main-Class"] = "com.example.MyMainClass"
// OR another notation
// manifest {
// attributes["Main-Class"] = "com.example.MyMainClass"
// }
}
만약 당신이 어떤 외부의 도서관을 사용한다, 코드 아래를 사용한다.복사해서 도서관 JARs 당신의 결과 JAR을의 libs sub-directory에.라이브러리 JAR 파일을 파일 이름에 공간이 있지 않도록 하십시오.
tasks.jar {
manifest.attributes["Main-Class"] = "com.example.MyMainClass"
manifest.attributes["Class-Path"] = configurations
.runtimeClasspath
.get()
.joinToString(separator = " ") { file ->
"libs/${file.name}"
}
}
에서는 NOT 에 을 .Class-Path
기여하다.그래서 우리는 Gradle 의존 관계의 절대 경로(또한이와 다른 시스템에서 이용할 수 없었던 경향이 있)을 사용하지 못한다.만약 당신이 절대적인 경로를 사용하고 싶다면, 아마도 이 해결 방법 일할 것이다.
다음과 같은 명령과:JAR를 만듭니다.
./gradlew jar
그 결과 JAR build/libs/ 디렉터리에서 기본적으로 조성될 것이다.
방법 2:도서관들은 그 결과 JAR 파일에( 있는 경우) 묻기.
tasks.jar {
manifest.attributes["Main-Class"] = "com.example.MyMainClass"
val dependencies = configurations
.runtimeClasspath
.get()
.map(::zipTree) // OR .map { zipTree(it) }
from(dependencies)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
그 JAR을 만드는 것은 정확히 그 이전의 방법과 같다.
방법 3:그림자 플러그를 사용합니다.
plugins {
id("com.github.johnrengelman.shadow") version "6.0.0"
}
// Shadow task depends on Jar task, so these will be reflected for Shadow as well
tasks.jar {
manifest.attributes["Main-Class"] = "org.example.MainKt"
}
이 명령에 대해서 JAR를 만듭니다.
./gradlew shadowJar
는 플러그 구성에 대한 더 많은 정보를 참조하십시오 그림자 documentations.
만들어진 JAR 달리기
java -jar my-artifact.jar
위의 해결책을:시험을 쳤다.
- 자바 17
- Gradle 7.1 (.kts 빌드 스크립트에 Kotlin 1.4.31 사용)
uber(팻) JAR 작성에 대해서는 Gradle 공식 문서를 참조하십시오.
매니페스트에 대한 자세한 내용은 Oracle Java 문서를 참조하십시오. 매니페스트 파일 작업.
리소스 파일은 자동으로 JAR 파일에 포함됩니다(이 파일이 빌드 파일의 리소스 루트로 설정된 /src/main/resources/ 디렉토리 또는 커스텀디렉토리에 배치되어 있는 경우).응용 프로그램의 리소스 파일에 액세스하려면 다음 코드를 사용합니다(참고)./
「」의 「」의 「 。
val vegetables = MyClass::class.java.getResource("/vegetables.txt").readText() // Alternative ways: // val vegetables = object{}.javaClass.getResource("/vegetables.txt").readText() // val vegetables = MyClass::class.java.getResourceAsStream("/vegetables.txt").reader().readText() // val vegetables = object{}.javaClass.getResourceAsStream("/vegetables.txt").reader().readText()
- 바
var stream = MyClass.class.getResource("/vegetables.txt").openStream(); // OR var stream = MyClass.class.getResourceAsStream("/vegetables.txt"); var reader = new BufferedReader(new InputStreamReader(stream)); var vegetables = reader.lines().collect(Collectors.joining("\n"));
모듈 설정(또는 프로젝트 구조)에서 jar 아티팩트를 정의할 수 있습니다.
- 종속성이 있는 모듈에서 module > Open module settings > Architects > + > JAR > 를 오른쪽 클릭합니다.
- 메인 클래스를 설정합니다.
항아리를 만드는 것은 "아파트를 만드는 것"을 클릭하기만 하면 됩니다."를 클릭합니다.보너스로 모든 종속성을 하나의 병에 포장할 수 있습니다.
IntelliJ IDEA 14 Ultimate에서 테스트 완료.
솔루션에 관한 링크를 몇 개 체크하고, 최종적으로 이하의 순서를 실행해 동작시켰습니다.Gradle 2.9를 사용하고 있습니다.
build, gradle 파일을 다음과 같이 변경합니다.
언급 플러그인:
apply plugin: 'eu.appsatori.fatjar'
Buildscript 제공:
buildscript { repositories { jcenter() } dependencies { classpath "eu.appsatori:gradle-fatjar-plugin:0.3" } }
기본 클래스 제공:
fatJar { classifier 'fat' manifest { attributes 'Main-Class': 'my.project.core.MyMainClass' } exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF' }
fatjar를 만듭니다.
./gradlew clean fatjar
/build/libs/에서 fatjar를 실행합니다.
java -jar MyFatJar.jar
다음은 Gradle 6.7과 함께 시도한 솔루션입니다.
실행 가능한 Fat Jar(모든 종속 라이브러리를 항아리에 복사)
task fatJar(type: Jar) {
manifest {
attributes 'Main-Class': 'com.example.gradle.App'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
} with jar
}
모든 종속성을 디렉터리에 복사하고 매니페스트에 클래스 경로를 추가하는 실행 가능한 jar
def dependsDir = "${buildDir}/libs/dependencies/"
task copyDependencies(type: Copy) {
from configurations.compile
into "${dependsDir}"
}
task createJar(dependsOn: copyDependencies, type: Jar) {
manifest {
attributes('Main-Class': 'com.example.gradle.App',
'Class-Path': configurations.compile.collect { 'dependencies/' + it.getName() }.join(' ')
)
}
with jar
}
사용방법
- 위의 태스크를 build.gradle에 추가합니다.
- 실행
gradle fatJar
//fatJar 생성 - 실행
gradle createJar
// 종속성이 복사된 jar를 만듭니다.
자세한 내용은 https://jafarmlp.medium.com/a-simple-java-project-with-gradle-2c323ae0e43d 를 참조해 주세요.
- 매니페스트에 대한 기본 클래스 구성
gradle 프로젝트를 사용하는 경우 다음 항목을 build.gradle에 추가합니다.
jar {
manifest {
attributes(
'Main-Class': 'pokerhandscorer.PokerHandScorer'
)
}
}
- 여기서 'pokerhandscorer'은 패키지 이름이고 PokerHandScorer은 기본 클래스 이름입니다.
그러면 \build\libs{jarFilename}jar에 jar 파일이 생성됩니다.
- jar 파일을 java -jar /{path}/{jarFileName}을(를) 사용하여 실행합니다.jar}
java - jar / {path} / {jar File Name } 。jar}
언급URL : https://stackoverflow.com/questions/21721119/creating-runnable-jar-with-gradle
'itsource' 카테고리의 다른 글
요소 UI의 입력 구성 요소와 $ref 사용 (0) | 2022.08.17 |
---|---|
C에서 빅 엔디안을 리틀 엔디안으로 변환하다[제공된 펑크를 사용하지 않고] (0) | 2022.08.17 |
CMakeLists.txt를 생성하는 방법 (0) | 2022.08.17 |
vue.js for loop 내의 함수를 호출하여 현재 항목을 전달하려면 어떻게 해야 합니까? (0) | 2022.08.17 |
클래스와 인터페이스를 갖춘 Java Generics - 함께 (0) | 2022.08.17 |