Правильный подход для замены задачи ANT пользовательской задачей gradle, написанной на java, и установки наборов файлов ant для задач gradle - PullRequest
0 голосов
/ 27 сентября 2019

Я работаю над переносом одного из наших Java-проектов ANT и MAVEN в GRADLE.Я могу перенести часть сборки и небольшую муравьиную цель с помощью пользовательской задачи Gradle.Однако у нас есть некоторый код, написанный на Java, который расширяет org.apache.tools.ant.Task, и он вызывается во время выполнения через ant с использованием build.xml.У build.xml есть typedef, ссылающийся на задачу ant (например, MyDataImportTask), которая перебирает список наборов файлов (различные файлы из некоторого шаблона сопоставления каталогов), а затем выполняет некоторые обновления в базе данных или что-то в этом роде.У него есть зависимости от библиотек, таких как hibernate, apache ant и т. Д.

Теперь я пытаюсь написать пользовательскую задачу, используя gradle для переписывания этого класса, и не могу найти правильный подход.Я застрял, как передать наборы файлов в эту пользовательскую задачу.Я также попытался использовать gradle SourceTask, где мы можем установить исходные объекты, но не работающие.Может кто-нибудь помочь мне, пожалуйста?

Вторая проблема заключается в том, что в настоящее время этот модуль является частью проекта Java.Я пытаюсь переместить его в папку buildSrc для пользовательской задачи, которую я переписываю.У меня такое ощущение, что это неправильный подход.Мне интересно, как передать исходные наборы файлов в скомпилированный файл JAR, а затем вызвать его из пользовательской задачи GRADLE.Может кто-нибудь помочь мне, пожалуйста?

Ниже приведен пример класса, который расширяет задачу ant и затем используется в build.xml для ее выполнения.

public class MyDataImportTask extends org.apache.tools.ant.Task{
    private String myPrefix;
    //getter setter

    private List<FileSet> filesets = new ArrayList<FileSet>();

    public void execute() throws BuildException{
        ClassLoader cl = getClass().getClassLoader();
        ((AntClassLoader) cl).setThreadContextLoader();

        try{

            for (int i = 0; i < filesets.size(); i++) {
                    FileSet fs = (FileSet) filesets.get(i);
                    DirectoryScanner ds = null;
                    try {
                        ds = fs.getDirectoryScanner(getProject());
                    } catch (BuildException e) {
                        getLogger().info("Warning: " + e.getMessage());
                        continue;
                    }

                    final File fromDir = fs.getDir(getProject());
                    final String[] srcFiles = ds.getIncludedFiles();

                    if (srcFiles != null) {
                        //Do something with srcFiles
                    }

            }
        }

        finally {
            ((AntClassLoader) cl).resetThreadContextLoader();
        }
    }
}

У меня есть сборка ANT.xml со следующим кодом:

    <typedef name="mydataimport" classname="com.surendra.data.tasks.MyDataImportTask" classpathref="classpath"/>

    <mydataimport myPrefix="myData.">
        <fileset dir="${rootDir}/MyData/types">
            <include name="abc.xmi" />
        </fileset>
        <fileset dir="${rootDir}/MyData/types">
            <include name="*.xmi" />
            <exclude name="abc.xmi" />
        </fileset>
    </mydataimport>

Я ожидаю, что моя пользовательская задача будет вызываться в build.gradle как:

task myDataImportTask(type: MyDataImportTask){
    sources = "${rootDir}/MyData/types"
    patternToInclude1 ="*.xmi" 
    patternToExclude ="abc.xmi" 
}
...