Gradle:验证类的列表在构建时的类路径中

时间:2014-05-16 04:21:30

标签: java groovy gradle classpath

我有一个包含数十个XML文件的多项目构建,我的问题是你在某些XML文件中指定了一个完整的类名(例如com.myproject.CheckItem),但是在任何时候都没有检查来验证您在构建过程中输入的内容是正确的。您只能通过访问使用XML的应用区域来查看您输入的内容是否正确。

我想做的是在gradle构建期间的某个时刻验证这些XML文件中定义的类名是我的一个类,还是在我添加为两个lib文件夹的其中一个jar文件中的依赖关系。

我现在所处的位置是Map<String, List<String>>,其中所有键都是类名,值是包含该键的文件列表。

所以,它看起来像这样:

com.myproject.CheckItem
  - C:\Development\my-app\app-core\src\main\resources\META-INF\Totally.xml
  - C:\Development\my-app\app-filter\src\main\resources\META-INF\Awesome.xml

com.myproject.CheckSquare
  - C:\Development\my-app\app-core\src\main\resources\META-INF\FarOut.xml

我一直在整夜摆弄着寻找最好的方法,最简单的方法是做这样的事情:

try {
    Class.forName("com.myproject.CheckItem", false, this.getClass().getClassLoader());
    // it exists on the classpath
} catch(ClassNotFoundException e) {
    // it does not exist on the classpath
}

然而,我还没有把它集成到Gradle构建过程中,这是我喜欢它的地方,最好是从我自己的Gradle插件中分离出来。

作为替代方案,我考虑过进行参数化单元测试,因为在单元测试中它可以轻松访问类路径,我可以做上述操作,但更喜欢在Gradle构建过程中进行

建议?

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我通过JavaExec任务解决了这个问题。一般的想法是:在实用程序项目中编写java代码,使用主项目依赖项从gradle运行它,并在classpath,profit上编译类。

就我而言,我正在检查一个包的Hibernate注释,然后生成一个输出文件的模式。我找到了maven的解决方案:http://blog.iprofs.nl/2013/01/29/hibernate4-schema-generation-ddl-from-annotated-entities/并调整它以满足我的需求。

在我的gradle构建中(用作示例):

task (generateSchema, dependsOn: 'classes', type: JavaExec){
    main = 'nl.iprofs.examples.util.SchemaGenerator'
    classpath = files('./hibernate-schema-generator-1.0.jar',configurations.compile, sourceSets.main.output.classesDir)
    args 'my.package.entities'
    args 'src/main/resources/'
    args 'TSQL'
}

build.dependsOn generateSchema

在您的情况下,您希望将xml名称作为参数传递。

答案 1 :(得分:0)

我最终将Gradle项目构建为多项目Gradle构建,最终创建了一个build-test项目,该项目具有编译依赖项所有必需的子项目和全局依赖项。

然后我创建了进行类路径检查的参数化junit测试,这样我就可以:

  1. 选择跳过测试
  2. 查看详细的html报告,了解与检查构建日志不一致的内容
  3. 这比做enlait建议的更简单。