【问题标题】:Use local jar as a dependency in my Gradle Java project在我的 Gradle Java 项目中使用本地 jar 作为依赖项
【发布时间】:2019-09-30 03:28:00
【问题描述】:

我有一个名为 mylib.jar 的本地 jar 文件。我想在我的 Gradle Java 项目中使用它作为依赖项。

这是我尝试过的:

我在项目根目录下创建了一个libs/ 文件夹。我把jar文件放在libs/文件夹下。

MyProject
 ->libs/mylib.jar
 ->build.gradle
 ->src/...

在我的 build.gradle 中:

apply plugin: 'java-library'

group 'com.my.app'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()

    flatDir {
        dirs 'libs'
    }
 }

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    api files('libs/mylib.jar')
}

但我无法访问项目代码中mylib.jar 中定义的公共类。为什么?

===== 更多信息 =====

我的罐子里的内容:

mylib.jar
    > com.my.jar.package
      >ClassFromJar.class

这是我使用 jar 的方法:

// Compilation error: Cannot resolve symobl 'ClassFromJar'
import com.my.jar.package.ClassFromJar;

public class MyEntryPoint {
    // Compilation error: Cannot resolve symbol 'ClassFromJar'
    ClassFromJar instance = new ClassFromJar();
}

【问题讨论】:

  • 你说的“无法访问公共课程”是什么意思?通过 Gradle 编译是否失败?你使用 IDE 吗?
  • 我的意思是那些在jar中声明的公共类不能被编译器解析。
  • 但是如何编译它们呢?你如何使用 Gradle?
  • 您的设置适合​​我。您的本地设置中一定有问题未在您的问题中提及。 JAR 文件可以吗?哪个确切的 Gradle 命令因哪个错误而失败?你的“项目代码”看起来如何?你能用显示错误的minimal reproducible example 更新你的问题吗?
  • @Leem.fin 你用的是什么IDE?您的 IDE 编译器是否无法解析它们,或者 Gradle 的命令行编译器是否无法解析它们?这是两个非常不同的事情,你还没有回答。

标签: java gradle jar


【解决方案1】:

Similar answers suggesting

  1. 本地目录

在您的模块 gradle 旁边添加(不是应用程序 gradle 文件):

repositories {
   flatDir {
       dirs 'libs'
   }
}
  1. 相对路径:
dependencies {
    implementation files('libs/mylib.jar')
}
  1. 使用compile fileTree:
compile fileTree(dir: 'libs', include: 'mylib.jar')

【讨论】:

  • 我不在 Android 项目中。我的 Gradle 项目中只有一个 gradle 文件,即myProject/build.gradle,所以,如果您说“添加到您的模块 gradle 旁边(不是应用程序 gradle 文件)”,我会错过什么吗?
  • 实际上我的 build.gradle 中有 flatDir 东西。
  • 谢谢,但问题是我遵循了所有这些准则,但我的项目无法从 jar 中解析公共类。不是我不关注。
  • @leem.fin 你可以添加类(或主要部分)以及你如何尝试使用它吗?
【解决方案2】:

只有*.aar 需要flatDir 存储库(这是一种Android 特定的库格式,与给定的上下文完全无关)。 implementationapi 影响可见性,但这些也是 Android DSL 特定的)。在普通的 Java 模块中,可以这样引用:

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

并确保将*.jar 放到模块内正确的libs 目录中。

【讨论】:

    【解决方案3】:

    我认为你应该在依赖声明中使用 compile name: 'mylib' 在这种情况下 flatDir 将搜索 mylib.jar。

    您可以尝试以下 build.gradle(它适用于我的项目):

    plugins {
        id 'java'
    }
    apply plugin: 'java-library'
    
    group 'dependency'
    version '1.0-SNAPSHOT'
    
    sourceCompatibility = 1.8
    
    repositories {
        mavenCentral()
        flatDir {
            dirs 'libs'
        }
    }
    
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
        compile  name: 'mylib'
    }
    

    【讨论】:

      【解决方案4】:

      以防万一:

      1 - 编译器必须能够访问 lib 目录和 jar 示例:

      javac -cp .;lib\* *.java
      

      2 - 还必须在 java 文件中提及导入 在您的 java 中添加示例

      import static org.lwjgl.glfw.GLFW.*;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多