【问题标题】:eclipse and gradle: do not deploy test classeseclipse 和 gradle:不要部署测试类
【发布时间】:2017-04-22 03:21:39
【问题描述】:

我们在 Eclipse (neon) IDE 中有一个 JEE Vaadin 项目,我们使用 gradle 作为构建系统。但是我们的测试类有问题。如果我们用 gradle 构建我们的战争/耳朵,一切都很好。测试类不是战争档案的一部分。

但是,如果我们想从 Eclipse 内部将 ear 项目部署到 wildfly 服务器上,那么测试类似乎是 war 存档的一部分。因为在部署耳朵时,我们会遇到一些错误,例如:

...
Caused by: com.google.common.util.concurrent.ExecutionError: com.google.common.util.concurrent.ExecutionError: java.lang.LinkageError: Failed to link com/coco_on/docFlow/vaadin/admin/TestAdminRoles (Module "deployment.DFl_EAR.ear.DFl_Vaadin.war:main" from Service Module Loader)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2201)
    at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java:49)
    at org.jboss.weld.resources.DefaultReflectionCache.getBackedAnnotatedTypeAnnotationSet(DefaultReflectionCache.java:169)
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType.getAnnotations(BackedAnnotatedType.java:112)
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType.getAnnotation(BackedAnnotatedType.java:98)
    at org.jboss.weld.bootstrap.BeanDeployer.processPriority(BeanDeployer.java:105)
    at org.jboss.weld.bootstrap.BeanDeployer.processAnnotatedTypes(BeanDeployer.java:174)
    at org.jboss.weld.bootstrap.BeanDeployment.createTypes(BeanDeployment.java:224)
    at org.jboss.weld.bootstrap.WeldStartup.startInitialization(WeldStartup.java:381)
    at org.jboss.weld.bootstrap.WeldBootstrap.startInitialization(WeldBootstrap.java:76)
    at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:92)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    ... 3 more
Caused by: java.lang.NoClassDefFoundError: com/vaadin/testbench/TestBenchTestCase
...

TestAdminRoles 是我们的测试类之一,TestBenchTestCase 是测试框架 (Vaadin Testbench) 中所需的类之一。但是这个测试框架会找不到,这也没关系,因为我们不想把这个库链接到 ear/war 中。

我们也看过这篇文章:https://stackoverflow.com/a/9820317/1465758

所以我们已经从部署中删除了src/test/ 目录,并为测试源目录设置了一个不同的 bin 目录。但没有成功。上面的错误依然存在。

所以我的问题是:如何配置 eclipse 以便 eclipse 不会将编译后的测试类放到 war 文件中?

【问题讨论】:

    标签: eclipse gradle war


    【解决方案1】:

    您需要更改测试源的源文件夹的输出文件夹,并从部署程序集中删除测试目录。

    这应该添加到build.gradle。 (eclipse-plugin 也需要应用)

    eclipse {
        // change output dir of the sourcefolders
        classpath.file.whenMerged {
            entries.findAll { it instanceof org.gradle.plugins.ide.eclipse.model.SourceFolder }.each { 
                it.output = 'build/eclipse/' + (it.path.startsWith('src/test') ? 'output-test' : 'output')
            }
        }
    
        // removes test dirs from deployment assemble
        wtp.component.file.whenMerged {
            wbModuleEntries.removeIf {
                it instanceof org.gradle.plugins.ide.eclipse.model.WbResource && it.sourcePath.startsWith('/src/test')
            }
        }
    }
    

    Code Source(适用的小改动)
    在这个例子中,非测试源的输出目录也发生了变化,所有的输出目录都在 Gradle 的build-目录中。

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 2015-07-05
      • 2021-09-21
      • 2011-07-26
      • 1970-01-01
      • 2021-07-09
      • 2018-02-08
      • 2016-06-27
      相关资源
      最近更新 更多