【发布时间】:2013-10-02 18:56:24
【问题描述】:
我想从一个 Android 库项目中创建一个 Jar。设置方式如下:
ProjectName
\- lib
| \- lib
| \- armeabi
| \- libNativeFirst.so
| \- libNativeSecond.so
\- src
\- main
\- java
\- com.package.sdk
\- PackageSDK.java
我希望将所有这些打包在一个 Jar 中,但不透露 PackageSDK.java 中的源代码。
我这样设置我的build.gradle 文件:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android-library'
repositories {
mavenCentral()
}
android {
compileSdkVersion 18
buildToolsVersion "18.0.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 18
}
sourceSets {
main {
java {
srcDir 'src/main/java'
}
resources {
srcDir 'src/../lib'
}
}
}
}
task jar(type: Jar) {
from android.sourceSets.main.allSource
}
当我在项目目录中运行gradlew clean jar 时,会在ProjectName\build\libs 中创建一个名为ProjectName.jar 的Jar 文件。其结构如下:
ProjectName.jar
\- lib
| \- armeabi
| \- libNativeFirst.so
| \- libNativeSecond.so
\- com
\- package
\- sdk
\- PackageSDK.java
我希望在执行jar 任务时包含已编译的PackageSDK.class 而不是PackageSDK.java 文件。我可以改变什么来实现这一点?
编辑:
根据 Ben Manes 的建议,我将 sourceSets 的配置更改为以下内容:
sourceSets {
main {
java {
srcDir 'src/main/java'
}
resources {
srcDir 'src/../lib'
}
output {
classesDir 'build/classes'
resourcesDir 'build/javaResources'
}
}
}
而jar 任务如下:
task jar(type: Jar) {
from android.sourceSets.main.output
}
Gradle 现在给我这个输出:
Could not find method output() for arguments [build_25r1m0a3etn5cudtt5odlegprd$_run_closure2_closure9_closure10_closure13@138532dc] on source set main.
【问题讨论】:
-
尝试对类文件使用
android.sourceSets.main.output,而不是使用源来构建jar -
我应该将
sourceSets { main { output { srcDir '_____' } } }设置成什么? -
android插件不使用Java插件吗?其中大部分是预先配置的。也许这必须是
output.dirs。看看 Gradle user guide -
我认为它们在某些方面有所不同,但我不能 100% 确定。我用
.dirs尝试过,但它有同样的问题。我发现我可以只使用build/bundles/release中的classes.jar文件并将其重命名为ProjectName.jar,但我希望我不必这样做。
标签: android jar gradle android-studio android-gradle-plugin