Cómo hacer un .jar a partir de un proyecto de Android Studio


96

Estoy usando AndroidStudio y tengo este proyecto como se muestra:

ingrese la descripción de la imagen aquí

Lo que está dentro del círculo azul es myLib. myLib también necesita usar una biblioteca externa que esté dentro del círculo rojo y un paquete de apache (círculo verde).

Así que quiero hacer que todo esto se convierta en un solo .jar, para poder usarlo en otros proyectos.

Se agradecería mucho una guía paso a paso, soy un principiante en el mundo de los desarrolladores.

¡Gracias!


1
Creo que lo que quieres es un archivo aar (archivo de Android) que se pueda vincular de forma silenciosa y simple como dependencia. Básicamente, necesitas crear un proyecto de biblioteca de Android. Pero no puedo escribir los pasos exactos desde la mente.
rekire

2
Necesito un archivo .jar para poder usarlo en cualquier proyecto java. No solo de Android.
dum4ll3

1
Debe ser casi lo mismo: haga un proyecto de biblioteca y expórtelo.
Thrash Bean

Este error describe una deficiencia en el complemento gradle de Android que impide piratear fácilmente el archivo de compilación gradle para agregar un objetivo jar ...
mmigdol

Respuestas:


135
  • Abra build.gradle para el proyecto de biblioteca ingrese la descripción de la imagen aquí

  • Escriba dos tareas en build.gradle: deleteJar y createJar y agregue la regla createJar.dependsOn (deleteJar, build) ingrese la descripción de la imagen aquí

El código de arriba:

task deleteJar(type: Delete) {
    delete 'libs/jars/logmanagementlib.jar'
}           

task createJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('libs/jars/')
    include('classes.jar')
    rename('classes.jar', 'logmanagementlib.jar')
}

createJar.dependsOn(deleteJar, build)
  • Expanda el panel de Gradle desde la derecha y abra todas las tareas en su biblioteca-> otros. Verá dos nuevas tareas allí: createJar y deleteJar ingrese la descripción de la imagen aquí

  • Haga doble clic en createJar ingrese la descripción de la imagen aquí

  • Una vez que la tarea se ejecute correctamente, obtenga su jar generado de la ruta mencionada en la tarea createJar, es decir, libs / xxxx.jar ingrese la descripción de la imagen aquí

  • copie el jar recién generado en la carpeta lib de su proyecto requerido -> haga clic derecho -> seleccione "agregar como biblioteca"


4
A veces, la gente entiende viendo en lugar de leer. Es una buena experiencia de usuario que ves ☺
Abhinav Tyagi

5
Bueno, entonces debería decirte que no estoy seguro release. Tengo debugy default, pero no releasecarpeta. ¿Qué versión del complemento estás usando? ¿Sabes si esto está documentado en alguna parte?
Cameron Lowell Palmer

3
No tengo releasecarpeta.
Kamran Bigdely

4
¿Qué estás intentando copiar? ¿Se supone que debemos apuntar a las carpetas que contienen el archivo APK? Quiero decir, en la línea de ('build / intermediates / bundles / default'), ¿qué contiene este directorio para usted? No hay una carpeta en mi estudio de Android con los paquetes de nombres, y sigo obteniendo NO FUENTE en la tarea
createJar

12
cambio de ('build / intermediates / bundles / release /') a ('build / intermediates / packaged-classes / release /') para Android Studio 3.1.3 y Gradle versión 4.4
Vaishakh

59

Si configura el código como un módulo Java simple en Gradle, entonces es realmente fácil que Gradle le proporcione un archivo jar con el contenido. Ese archivo jar tendrá solo su código, no las otras bibliotecas de Apache de las que depende. Recomendaría distribuirlo de esta manera; es un poco extraño agrupar dependencias dentro de su biblioteca, y es más normal que los usuarios de esas bibliotecas tengan que incluir esas dependencias por su cuenta (porque de lo contrario hay colisiones de esos proyectos que ya están vinculando copias de la biblioteca, tal vez de diferentes versiones ). Además, evita posibles problemas de licencia relacionados con la redistribución del código de otras personas si tuviera que publicar su biblioteca.

Tome el código que también debe compilarse en un jar y muévalo a un módulo Java simple separado en Android Studio:

  1. ExpedienteMenú > Nuevo módulo ... > Biblioteca Java
  2. Configure la biblioteca, el nombre del paquete Java y los nombres de las clases en el asistente. (Si no desea que cree una clase para usted, puede eliminarla una vez que se crea el módulo)
  3. En su código de Android, configure una dependencia en el nuevo módulo para que pueda usar el código en su nueva biblioteca:
  4. Archivo > Estructura del proyecto > Módulos > (su módulo de Android) > Dependencias > + > Dependencia del módulo . Vea la captura de pantalla a continuación: ingrese la descripción de la imagen aquí
  5. Elija su módulo de la lista en el cuadro de diálogo que aparece: ingrese la descripción de la imagen aquí

Con suerte, su proyecto debería estar desarrollándose normalmente ahora. Después de hacer una compilación, se colocará un archivo jar para su biblioteca Java en el directorio build / libs del directorio de su módulo. Si desea construir el archivo jar a mano, puede ejecutar su tarea de archivo jar desde la ventana de Gradle: ingrese la descripción de la imagen aquí


¡Muchas gracias! Su respuesta fue realmente útil, la mayoría en la última captura de pantalla que muestra las tareas de Gradle. Yo no lo sabía. Podría seguir tus pasos, pero todavía me falta el org.apache.http.Header. ¿Cómo puedo importarlo a mi lib?
dum4ll3

¿A qué te refieres cuando dices que te lo estás perdiendo?
Scott Barta

1
Siga el mismo flujo de Estructura del proyecto> dependencias, pero elija su módulo de biblioteca en lugar de su proyecto y agregue la dependencia de la misma manera. En mi respuesta, digo que coloca el archivo jar en el directorio build / libs en su directorio de módulos.
Scott Barta

1
Tengo: java.lang.NoClassDefFoundError: com.loopj.android.http.RequestParams. Esa es mi biblioteca externa que estoy compilando con la mía.
dum4ll3

2
Funciona solo con la biblioteca Java y la tarea jar en la biblioteca de Android no existe
cuasodayleo

26

En el IDE de Android Studio, acceda a la " barra Ejecutar cualquier cosa " mediante:

CTRL+ CTRL+ gradle CreateFullJarRelease+ENTER

Después de eso, encontrará su artefacto en esta carpeta en su proyecto
Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


O


Gradle ya tiene una Taskpara eso, en el menú lateral de Gradle, debajo de la othercarpeta.

barra de herramientas de gradle

Luego, desplácese hacia abajo createFullJarReleasey haga clic en él.

Tareas de Gradle

Después de eso, encontrará su artefacto en esta carpeta en su proyecto

Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


2
No puedo ver esta opción. ¿Se ha agregado esto en una versión reciente de Studio?
Dibzmania

1
Construyo y cuando encuentre * .jar su nombre es: full.jar. 30 minutos para encontrarlo lol
nobjta_9x_tq

1
En mi caso, lo encontré enbuild\intermediates\intermediate-jars\release
Yusril Maulidan Raji

Tengo una pregunta. En mi caso, genera 3 archivos jar. classes.jar, full.jary res.jar. ¿Debo importar todos los archivos jar siempre que quiera usarlos?
Yusril Maulidan Raji

Solo usa el frasco completo
Haroun Hajem

11

Simplemente agregue esto al build.gradle de su módulo java. Incluirá bibliotecas dependientes en el archivo.

mainClassName = "com.company.application.Main"

jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

Esto dará como resultado el archivo [nombre_módulo] / build / libs / [nombre_módulo] .jar.


Pero, ¿una biblioteca .jar tendría una clase principal? El OP dice que están construyendo un archivo .jar "para que pueda usarlo en otros proyectos" (sic). Eso suena a biblioteca.
Steve White

Solo este tipo realmente entendió eso, solo la creación de jarras no resuelve el problema. ¿Qué pasa si necesitamos ejecutarlo? El código anterior evita el error "No se puede ejecutar el archivo jar:" no hay atributo de manifiesto principal "".
MobileEvangelist

1

El archivo .jar se generará automáticamente cuando compile / ejecute su aplicación.

Puede encontrar su archivo class.jar en root_folder / app / build / intermediates / bundles / debug

ubicación del archivo jar


1
  1. Vaya a la pestaña Gradle en Android Studio, luego seleccione el proyecto de biblioteca.

  2. Luego ve a Tareas

  3. Luego ve a Otro

  4. Haga doble clic en bundleReleaseaar

Puede encontrar sus .aararchivos enyour_module/build/outputs/aar/your-release.aar

Aquí imagen


No veo ninguna "pestaña Gradle" en ninguna parte. Finalmente, escribí "Gradle" en la búsqueda de ayuda y obtuve algo parecido a la vista de Gradle. Pero la lista en el interior es muy diferente, mucho más corta que la tuya. No hay bundleReleaseaar en Tareas-> Otro. Hay un "createJar", pero cuando hago clic en él, aparece "Task 'createJar' not found in root project ..." Estoy atascado. Y ... ¿por qué queremos archivos .aar? El OP solicitó un archivo .jar. ¿Es lo mismo?>
Steve White

Pero la pregunta es cómo hacer que .jarno.aar
Aleksey Timoshchenko

0

la forma en que encontré fue encontrar la salida del compilador del proyecto (estructura del proyecto> proyecto). luego busque la carpeta completada del módulo que desea convertir en un jar, comprímalo con zip y cambie la extensión de la salida de zip a jar.


0
task deleteJar(type: Delete) {
    delete 'libs/mylibrary.jar'
}           

task exportjar(type: Copy) {
    from('build/intermediates/compile_library_classes/release/')
    into('libs/')
    include('classes.jar')
    rename('classes.jar', 'mylibrary.jar')
}

exportjar.dependsOn(deleteJar, build)

0

Si ejecuta una tarea de Gradle desde AndroidStudio [Más]

assembleRelease 
//or
bundleReleaseAar

o vía terminal

./gradlew <moduleName>:assembleRelease
//or
./gradlew <moduleName>:bundleReleaseAar

entonces podrás encontrar .aaren

<project_path>/build/outputs/aar/<module_name>.aar
//if you do not see it try to remove this folder and repeat the command

.aarEl archivo (Biblioteca de Android) consta del archivo .jar(Biblioteca de Java) y recursos adicionales de Android. .aararchivo es un archivo zip con AAR extensión es por eso que se puede sustituir .aarcon .zipo correr

unzip "<path_to/module_name>.aar"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.