Gradle绝对/相对路径

时间:2015-08-18 17:33:21

标签: java android gradle

我有以下问题。当我想在我的Gradle依赖项中使用本地jar时。

如果我只是添加:

compile files('libs/PushLinkAndroid-5.3.0.jar')

它不起作用。

  

C:\ Users \ Kai \ AndroidStudioProjects \ ProjectA \ app \ src \ main \ java \ de \ xyz \ xxx \ projecta \ BaseActivity.java:21:error:package com.pushlink.android不存在   import com.pushlink.android.PushLink;

     

注意:某些输入文件使用或覆盖已弃用的API。   注意:使用-Xlint重新编译:弃用以获取详细信息。   4个错误

     

FAILED

     

失败:构建因异常而失败。

     
      
  • 出了什么问题:   任务':app:compileDebugJava'执行失败。

         
        

    编译失败;有关详细信息,请参阅编译器错误输出。

      
  •   
  • 尝试:   使用--stacktrace选项运行以获取堆栈跟踪。使用--info或> - debug选项运行以获得更多日志输出。

  •   
     

建立失败

     

总时间:6.543秒

如果我添加Jar的绝对路径,项目编译并且一切正常:

compile files('C:/Users/Kai/AndroidStudioProjects/ProjectA/libs/PushLinkAndroid-5.3.0.jar')

看起来路径有问题但是当绝对路径工作正常时怎么会这样?

修改 的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "de.xyz.kai.migraenebook"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    //compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.jakewharton:butterknife:7.0.1'
    compile project(':volley')
    debugCompile 'im.dino:dbinspector:3.2.1@aar'
    compile 'de.hdodenhof:circleimageview:1.3.0'
    compile 'com.android.support:recyclerview-v7:+'
    //compile files('C:/Users/Kai/AndroidStudioProjects/MigraeneBook/libs/PushLinkAndroid-5.3.0.jar')
    compile files('libs/PushLinkAndroid-5.3.0.jar')
    //compile files('libraries/PushLinkAndroid-5.3.0.jar')
    //compile files('C:/Users/Kai/AndroidStudioProjects/MigraeneBook/libraries/PushLinkAndroid-5.3.0.jar')
}

注意:我尝试了不同的文件夹,PushLink.jar位于“libs”和“libraries”中。它使用哪个命令或注释掉也没有区别 - 绝对路径是有效的,相对不是。

7 个答案:

答案 0 :(得分:8)

试试这个,它会包含本地存储库中的所有JAR,因此您不必每次都指定它:

dependencies {
   compile fileTree(dir: 'libs', include: ['*.jar'])
}

此外,您应该知道通过

引用文件时
files("relative/path/to/a.jar")

路径是相对于此代码段所在的buildscript进行评估的。因此当build.gradle文件位于/a/project/build.gradle时,jar应位于/a/project/relative/path/to/a.jar中。 在多项目gradle构建中,您可以将jar放在相对于根项目的文件夹中,并通过

在所有子项目中引用它。
rootProject.files("relative/to/root/a.jar")

因此请考虑此问题并重新检查您的平板设置是否正确。

答案 1 :(得分:2)

首先,我认为添加手动库 - 如果可以避免 - 是不好的做法,因为你需要自己维护lib和路径。

我快速浏览了maven repo,似乎他们没有这个特定的lib。这就是我所期待的:

compile('com.anypackage.name.PushLinkAndroid-5.3.0.jar')

由于这可能不适合您,而不是https://www.pushlink.com/changelog.xhtml的开发人员团队,因此无法提供帮助。

现在问题:您是否使用--stacktrace开始构建?

从我可以从中收集

compile files('C:/Users/Kai/AndroidStudioProjects/ProjectA/libs/PushLinkAndroid-5.3.0.jar')

您正在使用Windows系统。这在某些方面很麻烦,因为Gradle期望路径看起来像这样:

C:/Users/Kai/AndroidStudioProjects/ProjectA/libs/PushLinkAndroid-5.3.0.jar

我的猜测是,当你没有自己指定路径时,gradle会做这样的事情:

C:\Users\Kai\AndroidStudioProjects\ProjectA\libs/PushLinkAndroid-5.3.0.jar

您可以使用此gradle任务验证行为:

task printBuildDir() {
    def buildDir = "${buildDir}"
    println buildDir
    def fixedDir = buildDir.replaceAll('\\\\', '/')
    println fixedDir
}

如果我的猜测是正确的,你有几个选择:

  1. 使用完整路径
  2. 使用gradle内置路径(如buildDir)并相应地替换示例(我不确定这是否与我在依赖项标签中的示例完全相同,也许您需要自己定义一个全局变量)
  3. 让PushLink的开发人员将此库添加到Maven Repo

答案 2 :(得分:1)

你的libs文件夹放错了地方。您必须将其置于MigraeneBook/app下,而不是直接置于MigraeneBook下。

答案 3 :(得分:1)

指定每个JAR文件名也是一种可能性。

dependencies {
    compile files('lib/dependency_one.jar', 'lib/dependency_two.jar')
}

这将告诉Gradle在编译期间包含dependency_one.jar和dependency_two.jar。 要确认编译配置中包含所有必需的JAR,您可以创建此帮助程序任务

task listJars << {
    configurations.compile.each { File file -> println file.name }
}

然后运行它,

$ gradle -q listJars
hibernate-core-3.6.7.Final.jar
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-3.2.0.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
jta-1.1.jar
slf4j-api-1.6.1.jar

https://docs.gradle.org/current/userguide/declaring_dependencies.html

了解详情

答案 4 :(得分:1)

旧问题,但可能会对某人有所帮助。 我遇到了同样的问题,在项目根文件夹中有2个库,并且它不适用于相对路径。如果库位于项目的根文件夹中,则在相对路径前添加../。

implementation fileTree(dir: 'libs', include: ['*.jar'])
...
implementation files('../library_name/libs/some.jar')

答案 5 :(得分:0)

我的问题是我从Android Studio IDE本身复制了它,就像将lib +中的command + c从一个项目复制到另一个库中一样。由于某种原因,AS会生成大小为零的jar文件...但是,我了解了有关Gradle的一些新知识:)

答案 6 :(得分:0)

如果调用URL方案路径,则可以使用以下示例:

def path = "file://${projectDir}/ojdbc6.jar"