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

Gradle EAR与其他项目的可传递LIB

汲利
2023-03-14

Gradle构建脚本创建了一个EAR文件,其中包含一些JAR和一个war。这之前都是在Maven中完成的,现在是迁移到Gradle的主题。

  • 梯度1.12
  • Groovy 2.2.1
  • Java 1.7.0_60 Oracle
  • 日食开普勒SR 2

...很简单:到目前为止,它是有效的——耳朵插件创建耳朵文件,其中包含来自

deploy project(:core)

在“dependencies”部分中,“core-0.0.1.jar”位于ear根目录下,并且已经在应用程序中创建了一个模块条目。xml。现在我发现ear文件中不包含运行库库。因此,我(根据docu)将纳入内容改为

earlib project(:core)

并在libs目录中找到libs,如ear插件配置中的“libDirName”属性所述。但现在应用程序中没有模块条目。xml和“core-0.0.1.jar”在libs目录中。

我们想要核心-0.0.1。jar作为ear根目录中的一个模块,以及libs目录中的所有运行时库——没有模块本身的jar!(core-0.0.1.jar不是战争!)就像这样。。。

[APP.EAR]  
|--/libs  
|  |-- log4j.jar  
|  |-- commons.jar  
|  |>> app-core.0.0.1.jar <<== NOT !
|  
|-app-core-0.0.1.jar <== OK!  
|-app-xy-0.0.1.jar  
|-app-abc-0.0.1.war 

这是我对EAR概念的根本理解不足,还是为什么Gradle本身没有按照我们想要的方式行事?或者这个简单的小步骤可能需要更复杂的配置?

共有2个答案

越飞翮
2023-03-14

如果ear模块之间存在编译时依赖关系,则可接受的解决方案将失败。这就是我在Gradle 2.14中解决这个问题的方法。希望这对别人有帮助。

apply plugin: 'ear'

def deployedModules = [ 'projectA', 'projectB', 'projectC' ]

deployedModules.forEach {
    def projectPath = ":${it}"

    evaluationDependsOn(projectPath)

    dependencies.add('deploy', dependencies.project(path: projectPath,
                                                    configuration: 'archives'))
    findProject(projectPath).configurations.runtime.allDependencies.forEach {
        boolean isEarModule = it instanceof ProjectDependency &&
                (it as ProjectDependency).dependencyProject.name in deployedModules
        if (!isEarModule) {
            dependencies.add('earlib', it)
        }
    }
}
从光启
2023-03-14

我自己找到了解决方案...在尝试了很多很多其他帖子的“解决方案”后。这是我所做的,它是其他的组合:

我创建了一个提供的配置——这样这些依赖项就不会出现在编译配置中——并将其添加到项目的类路径中。所以它们在编译类路径中,但不在编译配置中!我所有的项目都是这么做的。

// Libs need for compilation, but not to be published with EAR 
configurations { provided } 

dependencies {
    provided 'javax:javaee-api:6.0'
    provided 'org.slf4j:slf4j-api:1.7.7'

    compile 'com.application:application-common:1.4.5-SNAPSHOT'
}

configurations.provided.each { logger.debug("PROVIDED::core:  $it\n") }

// Include the PROVIDED libs into compile classpath
sourceSets { 
    main {  compileClasspath += configurations.provided }
}

我必须包括“部署项目…”用于模块条目和根jar。对于可传递的lib,我使用了“earlib project…,configuration:'compile'”来确保只将编译配置中的文件(因此它们是运行jar所必需的)复制到ear中。

apply plugin: 'ear' 

dependencies { 
    // INCLUDE AS A MODULE with entry in application.xml 
    deploy project(path: ':core')
    // INCLUDE the TRANSITIVE LIBRARIES FOR RUNTIME not provided
    earlib project(path: ':core', configuration: 'compile')
} 

ear { .... 
} 

就这些!

为此我不得不说......分级摇滚!

 类似资料:
  • 问题内容: 如何对包含可选NSdate的可选数组进行排序? 如何根据dateCompleted对数组排序? 问题答案: 您的排序功能可以结合使用可选链接和nil合并运算符: 这将对值上的项目进行排序,所有和和一起的项目都被视为“在遥远的过去”,以便在所有其他项目之前对其进行排序。 Swift 3的 更新(假设是):

  • 我有一个具有以下依赖结构的gradle项目: 这是由Jersey和ASM4.1之间的不兼容性引起的(Jersey使用3.3.1,它具有不同的组id),这是从另一个模块提取的传递依赖项。 顺便说一句,我知道Idea13有更好的Gradle集成,但是(a)我们有12的许可证,而且不会很快升级整个开发团队;(b)Idea13在多语Gradle项目(Java/Scala)方面仍然存在一些问题,所以它不符合

  • 我试图在我的工作区中创建一个新的java项目。但我得到以下错误: ”重叠其他项目的位置”我目前的项目在: 如果我从Eclipse创建一个新项目,则新项目将位于: 我尝试了以下步骤来解决stackoverflow中其他帖子中提到的问题。com:Eclipse:错误“.与另一个项目的位置重叠..”尝试创建新项目时 但我无法解决这个问题。有人能帮忙吗?

  • 问题内容: 我遇到了我认为应该是一个非常简单的问题。 我需要将arrayList中的每个项目与列表中的其他所有项目进行比较,而无需将项目与其自身进行比较。它不像调用equals()比较那样简单,它涉及一些自定义逻辑,我在下面的代码中省略了这些自定义逻辑。而且,ArrayList不应以任何方式更改。 我似乎遇到的问题是,一旦进入第二个循环,我就不知道是否有另一个对象要与之比较(因为它是一个可变大小的

  • 问题内容: 我有一个Eclipse插件项目,它取决于我在Eclipse工作区中拥有的其他项目。在“ Java Build Path”->“ Projects”选项卡下添加项目依赖项,并在“ Order and Export”中选择项目后,我得到了java.lang.NoClassDefFoundError。 我假设其他项目未正确包含在插件中。有谁知道如何解决这一问题? 谢谢,詹姆斯 问题答案: E

  • 我创建了一个带有jar打包的maven实用程序项目,在该项目中,我实现了EntityManager接口来管理数据库连接和其他内容。但当我想(从另一个maven项目)将其与@Inject一起使用时,它就不起作用了。 有没有办法指定要使用哪个EntityManager实现? 重要提示:如果我在主项目中包含这个实体管理器,它是有效的。但是我正在努力避免这种情况,因为将来我会有其他项目使用相同的数据库。