Building a jar file from a gradle dependency - java

I need to make dex file from my android project. First, i need to compile my classes to jar. But i need dependencies in jar. otherwise, i'll get about 300 errors because of unknown methods. I need Timber in jar. but i can't find it in the internet. I searched a lot, but no luck. This is the link to the source code in github.
https://github.com/JakeWharton/timber
How do i build a jar from this gradle project?

To add gradle library to your project, you need to add implementation "package-group:package-name:package-version" to your build.gradle.
For Timber, you would do implementation "com.jakewharton.timber:timber:4.7.1".
If you want to compile your project, with its dependencies into a jar, then you want to look up "fat jars". Gradle Shadowjar is a plugin that does this.

Related

Are dependencies from jcenter compiled into aar library?

I have created a library (aar) in Android Studio that includes some utility methods that rely on Joda Time classes. I am using the dependency from jcenter with the following line of code in my gradle file
compile 'joda-time:joda-time:2.9.4'
I then added my library to a private maven repository and created a new Android project and added my library to it from this repo.
When I try to use my library's methods in the new project I get the following error:-
java.lang.NoClassDefFoundError: org.joda.time.DateTime
I tried going back to my library and instead of including joda time via jcenter I added the .jar file directly to my 'libs' folder and this time when I tried the methods in my new project they worked and I didn't get the above error.
Does this mean that dependencies are not actually compiled into the aar file when included from jcenter? Is there a way to do so?
The AAR file just contains the compiled dex code, manifest (partial) and resources for the library. When you copied the jar file for joda-time into your project, it gets built into the AAR. When using gradle dependencies, gradle (and therefore Android Studio) know how to resolve the joda-time library for building your AAR, but that is it. Since your AAR is being published on jcenter, you need to have a maven manifest for your AAR which also lists joda-time as a dependency. After that projects will be able to list just your library as a dependency and the dependency on joda-time will be resolved by gradle (via its maven support.)

What is the right way to export a jar using maven for a library project?

I have a library project which is built in maven. It has its dependencies. I need to export this project as a jar (Not a runnable jar). Should I include the dependencies along with my jar or should I not? Because when I exported the dependencies with my jar, there were conflicts when the same jars of different versions were used for projects that added this project as a dependency. But if I don't export with the dependencies, at run time this library project throws NoClassDefFound errors for its dependencies. So what is the right way to do this? If I don't export the dependencies with my jar, is there a way that the project using this library project could download those jars for the library project? If that is how I would do it, then wouldn't it mean that the project using this project must be using maven too? It won't be a good practice as whoever uses this library should be able to use whatever the build tools they want. I am pretty new to maven. Please advice.
It is largely to taste, some open source projects do both, providing with for and without so that it is easier to use in larger projects.
If you are using Maven for your other projects you can, when you declare a dependency on this library tell maven to exclude some of its component jars.

Error in adding external Jar libraries in android studio

This is w.r.t Android Studio 1.3.2
So when i try to add the Repo from the Import Module->Import Existing Jar,the library is added as a separate module and included in the settings.gradle.
After this when I try to use the Jar, I get the message
Add Library 'x' to the classpath
Once i add this to the classpath,I am able to access the classes however the project does not build with the following error,
class Xx cannot be found(Xx belongs to the jar)
Is there a work-around to this.
I can add the jar by creatings a libs folder in the app module and clicking on add as library.
However I do not want the jar inside the main module.
When you add any module dependency then it will not automatically added to gradle file.
You have to add that dependancy to gradle file manually..
Now here you are adding module to Android Studio project then, You have to add
compile project(':module_name')
So that you module will be attached to your app module.
Hope It will help.
Thank you.!
Do something like this:
To import your module:
Step-1; Goto File->new->import module. Select and import your module.
Step-2: In your app's build.gradle add compile project(':yourlibrary')
Step-3: Sync your gradle.
Now to add jar in the above module:
Step-1: Copy your jar file into your module's lib folder.
Step-2: In your module's build.gradle file add a dependency like compile files('libs/your_jar_file.jar')
Step-3 Sync your gradle and you are good to go.

Maven dependency can't find zip file for sendgrid-java

I am getting an error while trying to include sendgrid-java during the build of a grails project.
I've added a compile time dependency as described in the documentation:
compile 'com.sendgrid:sendgrid-java:2.1.0'
But when I try to build it, it fails to resolve the dependency. I can see it is trying to download this zip file from mavenCentral, but it does not exist:
http://repo1.maven.org/maven2/com/sendgrid/sendgrid-java/2.1.0/sendgrid-java-2.1.0.zip
If I browse to the parent directory I can see many similar files but no .zip file. How can I get it to resolve the dependencies without the expected zip file? Can you tell gradle to use just the .pom file instead? I'm stuck!
There is lots of useful stuff here in this parent folder, just not zip file and i just can't get gradle to use it:
http://repo1.maven.org/maven2/com/sendgrid/sendgrid-java/2.1.0/
You have put this in the plugins{} block instead of the dependencies{} of your BuildConfig.groovy.
plugins is for grails plugins, which are distributed as .zip files, hence the error message with the file not being found.
"Regular" maven/ivy dependencies are handled just by the dependencies block (like in Gradle if you will).
The way you have it in the dependencies section of buildConfig.groovy is correct. It is in the Maven Central repository. So if you just have mavenCentral() in your repositories section of buildConfig.groovy all should be well.

Why does Gradle only include classes from my library with project dependency

I'm building an Android app that has a dependency on a custom library, and Gradle is only willing to include my custom library when I use a project dependency, not when I use a files dependency to include the library's jar file. I'm building both my app and the library with the API levee 19 SDK.
failing dependencies section from build.gradle:
dependencies {
compile 'com.android.support:appcompat-v7:+'
compile files('libs/MyLibrary.jar')
}
If I use the above dependencies section, none of the class in MyLibrary.jar are included in the build apk file, as verified by extracting its classes.dex and running dexdump. I have also verified that all of the classes are present in the jar file I'm using.
If I use the following dependencies section, then all of the classes in MyLibrary are included in the apk file:
dependencies {
compile 'com.android.support:appcompat-v7:+'
compile project(':MyLibrary')
}
I'm using Android Studio 0.4.0, Gradle 1.9, and I think the Gradle plugin 0.7.1.
What is going on here? I'd really like to build my app with the API level 18 sdk to test compatibility, but I can't get that working unless I'm able to just use the jar file for my library.
Okay, this was my fault. My library's build.gradle was configured to only include the source files in the jar output file. The following is incorrect Gradle code and will give you the same problems as I've had.
task jar(type: Jar) {
from android.sourceSets.main.java
}
This answer shows how to fix the jar file creation. It's ugly, but it seems to work.
Jar task does not include dependencies in the final jar artifact.
From Gradle documentation on jar task:
The jar task creates a JAR file containing the class files and
resources of the project.
It assumes that since you are building jar for your project, all dependencies will be provided during runtime. As opposed to war, where all dependencies are usually included in the final artifact.
If you need to create "fat jar", which will include the dependencies, then look into specific plugins, for example gradle-fatjar-plugin.
It's a little bit of a longshot, but if you're not using Android Studio 0.4.0 and you've just added the jar file, try cleaning your project and rebuilding from scratch. We've seen this bug: https://code.google.com/p/android/issues/detail?id=63366 where libraries don't get included without cleaning the project, though this bug refers to a dependency downloaded from Maven and not a local jar file (which may or may not be an important difference). This was fixed in Android Studio 0.4.0 (more specifically, in the Gradle plugin 0.7.0).

Categories