当前位置: 首页 > 知识库问答 >
问题:

在Liferay DXP Gradle中启用传递依赖

苏胤
2023-03-14

我在Liferay DXP中为Google Analytics API编写了代码。我已经通过在build.gradle中编写来导入了以下jar

    compile group: 'commons-logging', name: 'commons-logging', version: '1.1.1'
    compile group: 'com.google.api-client', name: 'google-api-client', version: '1.22.0'
    compile group: 'com.google.api-client', name: 'google-api-client-appengine', version: '1.22.0'
    compile group: 'com.google.api-client', name: 'google-api-client-gson', version: '1.22.0'
    compile group: 'com.google.http-client', name: 'google-http-client-jackson2', version: '1.22.0'
    compile group: 'com.google.api-client', name: 'google-api-client-java6', version: '1.22.0'
    compile group: 'com.google.api-client', name: 'google-api-client-servlet', version: '1.22.0'
    compile group: 'com.google.apis', name: 'google-api-services-analytics', version: 'v3-rev132-1.22.0'
    compile group: 'com.google.http-client', name: 'google-http-client', version: '1.22.0'
    compile group: 'com.google.http-client', name: 'google-http-client-appengine', version: '1.22.0'
    compile group: 'com.google.http-client', name: 'google-http-client-gson', version: '1.22.0'
    compile group: 'com.google.http-client', name: 'google-http-client-jackson2', version: '1.22.0'
    compile group: 'com.google.http-client', name: 'google-http-client-jdo', version: '1.22.0'
    compile group: 'com.google.oauth-client', name: 'google-oauth-client', version: '1.22.0'
    compile group: 'com.google.oauth-client', name: 'google-oauth-client-appengine', version: '1.22.0'
    compile group: 'com.google.oauth-client', name: 'google-oauth-client-java6', version: '1.22.0'
    compile group: 'com.google.oauth-client', name: 'google-oauth-client-jetty', version: '1.22.0'
    compile group: 'com.google.oauth-client', name: 'google-oauth-client-servlet', version: '1.22.0'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.1'
    compile group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.0.1'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.1.3'
    compile group: 'javax.jdo', name: 'jdo2-api', version: '2.3-eb'
    compile group: 'org.mortbay.jetty', name: 'jetty', version: '6.1.26'
    compile group: 'org.mortbay.jetty', name: 'jetty-util', version: '6.1.26'
    compile group: 'com.google.code.findbugs', name: 'jsr305', version: '1.3.9'
    compile group: 'javax.transaction', name: 'transaction-api', version: '1.1'

此外,我还使用以下代码将其包含在bnd.bnd文件中:

Include-Resource: @google-api-client-1.22.0.jar,@google-http-client-1.22.0.jar,@google-api-client-java6-1.22.0.jar,@google-http-client-jackson2-1.22.0.jar,@google-http-client-gson-1.22.0.jar,@google-oauth-client-1.22.0.jar,@google-oauth-client-java6-1.22.0.jar,@gson-2.1.jar,@google-api-services-analytics-v3-rev132-1.22.0.jar,@jackson-core-2.1.3.jar,@commons-logging-1.1.1.jar,@google-api-client-appengine-1.22.0.jar,@google-api-client-gson-1.22.0.jar,@google-api-client-servlet-1.22.0.jar,@google-api-services-analytics-v3-rev132-1.22.0.jar,@google-http-client-appengine-1.22.0.jar,@google-http-client-jackson2-1.22.0.jar,@google-http-client-jdo-1.22.0.jar,@google-oauth-client-appengine-1.22.0.jar,@google-oauth-client-jetty-1.22.0.jar,@google-oauth-client-servlet-1.22.0.jar,@gson-2.1.jar,@httpcore-4.0.1.jar,@jackson-core-2.1.3.jar,@jdo2-api-2.3-eb.jar,@jetty-6.1.26.jar,@jetty-util-6.1.26.jar,@jsr305-1.3.9.jar,@transaction-api-1.1.jar

该模块编译良好,我能够得到JAR。但是当我在服务器上部署这个jar时,我总是得到未解决的需求:import-package:error。

我知道问题出在传递依赖上。我在Liferay社区的某个地方读到我们在build.gradle中提到的东西在编译时可用,它不在编译时寻找传递依赖,但在运行时我们也需要传递依赖。

Gradle可以自行下载传递依赖项,而不是在build.Gradle文件中单独提到它们。

共有1个答案

江文斌
2023-03-14

通过Include-Resource(或-includeresource)指定@some.jar,可以将JAR的所有内容复制到自己的JAR中。这是一个构建指令。

对于编译时,gradle可以识别和下载传递依赖项,但请注意,其中一些依赖项可能是可选的--在这种情况下,如果您想拥有所有这些依赖项,这是有问题的。另外:请注意,编译时依赖项并不一定意味着必须为运行时打包此依赖项。事实上,您使用IncludeResource进行的包装是由bnd完成的,而根本不是由gradle完成的。

您在这里指定的内容(包括您自己的jar中的30个jar)并不是最佳实践。如果它们是OSGi包,您应该将它们单独部署到OSGi运行时。如果它们不是OSGi bundle,您应该查找它们转换为OSGi bundle的地方。只有到那时,您才应该将剩下的非bundle包含在您自己的jar中,除非您找到了更好的选择(例如,您自己将它们变成bundles并向上游发送pullrequests)

为了演示:让我从IncludeResource指令中展开您的jar列表,您已经在一行中输入了这些jar:

  • @google-api-client-1.22.0.jar
  • @google-http-client-1.22.0.jar
  • @google-api-client-java6-1.22.0.jar
  • @google-http-client-jackson2-1.22.0.jar
  • @google-http-client-gson-1.22.0.jar
  • @google-oauth-client-1.22.0.jar
  • @google-oauth-client-java6-1.22.0.jar
  • @gson-2.1.jar
  • @google-api-services-analytics-v3-rev132-1.22.0.jar
  • @jackson-core-2.1.3.jar
  • @commons-logging-1.1.1.jar
  • @google-api-client-appengine-1.22.0.jar
  • @google-api-client-gson-1.22.0.jar
  • @google-api-client-servlet-1.22.0.jar
  • @google-api-services-analytics-v3-rev132-1.22.0.jar
  • @google-http-client-appengine-1.22.0.jar
  • @google-http-client-jackson2-1.22.0.jar
  • @google-http-client-jdo-1.22.0.jar
  • @google-oauth-client-appengine-1.22.0.jar
  • @google-oauth-client-jetty-1.22.0.jar
  • @google-oauth-client-servlet-1.22.0.jar
  • @gson-2.1.jar(哎呀,重复)
  • @httpcore-4.0.1.jar
  • @jackson-core-2.1.3.jar
  • @jdo2-api-2.3-eb.jar
  • @jetty6.1.26.jar
  • @jetty-6.1.26.jar
  • @jsr305-1.3.9.jar
  • @transaction-api-1.1.jar

虽然我不鼓励在自己的jar中继续包含30个jar,但对于那些不是OSGi包的依赖项,还有另一种选择:如果需要包含任何必需的(非可选的)传递依赖项,我知道gradle的compileInclude指令将自动包含它们。

我最近录制了一段关于不同分级选项的视频,很快(经过适当的编辑)将被添加到Liferay大学的(免费)OSGi基础课程中--视频的初步编辑可能有助于理解当您在自己的jar中包含第三方代码时发生了什么--您可以在这里找到它。

 类似资料:
  • 在应用中,您希望使用不同的类来处理不同的任务以保持代码的简洁。我们把这些类称为 依赖。如何将这些依赖关系传递给将在后台任务调用的方法呢? 当您在后台任务中调用静态方法时,仅限于应用程序的静态上下文,这需要您使用以下获取依赖关系的模式: 通过 new 手动实例化依赖 服务定位器模式 抽象工厂模式 或 建设者模式 单例模式 然而,所有这些模式使您的应用程序的单元可测试性方面变得非常复杂。为了解决这个问

  • 本文向大家介绍DBMS中的传递依赖,包括了DBMS中的传递依赖的使用技巧和注意事项,需要的朋友参考一下 什么是传递依存关系 当间接关系引起功能依赖性时,称为传递依赖性。 如果P-> Q且Q-> R为真,则P-> R为传递依赖。 要实现3NF,请消除传递依赖性。 示例 <电影列表> Movie_ID Listing_ID Listing_Type DVD_价格($) M08 L09 犯罪 180 M

  • 主要内容:依赖传递,依赖范围,依赖范围对传递依赖的影响,依赖调节Maven 依赖传递是 Maven 的核心机制之一,它能够一定程度上简化 Maven 的依赖配置。本节我们将详细介绍依赖传递及其相关概念。 依赖传递 如下图所示,项目 A 依赖于项目 B,B 又依赖于项目 C,此时 B 是 A 的直接依赖,C 是 A 的间接依赖。 Maven 的依赖传递机制是指:不管 Maven 项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,Mav

  • null 使用Jenkins Artifactory插件,我能够将这两个模块的JAR发布到Artifactory,但我的另一个依赖于的项目未能构建,出现以下gradle错误 找不到com.mygroup:lib-api:1.0.0-snapshot lib-api/build.gradle null null 我的理解是,ArtiFactory/Gradle应该足够聪明,能够将解析为最新的时间戳快

  • 我正在尝试构建一个简单的REST服务来学习OSGI。我正在使用Spark Servlet来处理请求。 我将 spark core 作为依赖项嵌入,在 maven 中构建了我的项目,并在部署时在 Karaf 中出现了布线包错误。 看起来我一个接一个地跟踪程序包,一个一个地解决每个错误,仅仅解决依赖关系就需要大约2个小时。显然我做错了什么。。 我应该如何执行此操作,以便使用 spark servlet

  • 问题内容: 我正在处理一个表,该表具有一个复合主键,该主键由1NF形式的两个属性(总共10个)组成。 在我的情况下,全功能的依赖项涉及依赖项, 这 依赖于我的主键中的 两个 属性。 部分依赖项依赖于主键中的任一属性。 传递依赖关系涉及功能依赖关系中的两个或多个非关键属性,其中一个非关键属性依赖于我的主键中的某个关键属性。 将可传递的依赖关系从表中拉出,似乎 在 规范化 之后 执行了此操作,但是我的