copy - top - Cómo copiar las bibliotecas de dependencias JARs en gradle
top hashtags instagram today (3)
Añadir:
build.dependsOn(copyToLib)
Cuando se gradle build
, Gradle compila las tareas y las tareas que dependan de ellas (declaradas por dependsOn
). Sin configurar build.dependsOn(copyToLib)
, Gradle no asociará la tarea de copia con la tarea de compilación.
Asi que:
apply plugin: ''java''
apply plugin: ''application''
manifest.mainAttributes("Main-Class" : "com.test.HelloWorld")
repositories {
mavenCentral()
}
dependencies {
compile (
''commons-codec:commons-codec:1.6'',
''commons-logging:commons-logging:1.1.1'',
''org.apache.httpcomponents:httpclient:4.2.1'',
''org.apache.httpcomponents:httpclient:4.2.1'',
''org.apache.httpcomponents:httpcore:4.2.1'',
''org.apache.httpcomponents:httpmime:4.2.1'',
''ch.qos.logback:logback-classic:1.0.6'',
''ch.qos.logback:logback-core:1.0.6'',
''org.slf4j:slf4j-api:1.6.0'',
''junit:junit:4.+''
)
}
task copyToLib(type: Copy) {
into "$buildDir/output/libs"
from configurations.runtime
}
build.dependsOn(copyToLib)
Tengo un tarro ejecutable con este build.gradle
apply plugin: ''java''
apply plugin: ''application''
manifest.mainAttributes("Main-Class" : "com.test.HelloWorld")
repositories {
mavenCentral()
}
dependencies {
compile (
''commons-codec:commons-codec:1.6'',
''commons-logging:commons-logging:1.1.1'',
''org.apache.httpcomponents:httpclient:4.2.1'',
''org.apache.httpcomponents:httpclient:4.2.1'',
''org.apache.httpcomponents:httpcore:4.2.1'',
''org.apache.httpcomponents:httpmime:4.2.1'',
''ch.qos.logback:logback-classic:1.0.6'',
''ch.qos.logback:logback-core:1.0.6'',
''org.slf4j:slf4j-api:1.6.0'',
''junit:junit:4.+''
)
}
pero la ejecución falló, porque las dependencias que jars no pueden encontrar.
y luego agrego este código:
task copyToLib(type: Copy) {
into "$buildDir/output/libs"
from configurations.runtime
}
pero nada cambia ... no puedo encontrar la salida de la carpeta / libs ...
¿Cómo puedo copiar las dependencias de los archivos jar de libs a una carpeta o ruta especificada?
Considero que el complemento de la aplicación es demasiado engorroso y demasiado detallado en su salida. Así es como finalmente conseguí una configuración con la que estaba satisfecho, es decir, crear un archivo zip de distribución con archivos jar de dependencia en el subdirectorio /lib
y agregar todas las dependencias a la entrada Class-Path
en el archivo de manifiesto:
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:
// http://.com/questions/22659463/add-classpath-in-manifest-using-gradle
// https://gist.github.com/simon04/6865179
}
Alojado como una esencia here .
El resultado se puede encontrar en las build/distributions
y los contenidos descomprimidos se ven así:
lib / commons-lang3-3.3.2.jar
MyJarFile.jar
Contenido de MyJarFile.jar#META-INF/MANIFEST.mf
:
Versión de manifiesto: 1.0
Clase principal: com.somepackage.MainClass
Class-Path: lib / commons-lang3-3.3.2.jar
El complemento de la aplicación requiere que establezca el nombre de la clase principal de esta manera:
mainClassName = "com.test.HelloWorld"
Necesitará agregar eso a su script de compilación. Tenga en cuenta que si intenta ejecutar su aplicación con el comando java
, también necesitará configurar el classpath con -cp
.
El complemento de la aplicación simplifica este proceso al proporcionar la tarea distZip . Si ejecuta esa tarea, se creará una distribución completa para usted bajo build/distributions
. La distribución contiene scripts de inicio y todas las dependencias. Los scripts de inicio generados ya establecen la ruta de clase para que usted no tenga que lidiar más con ella.