Сгенерировать градацию sources.jar только для общедоступных интерфейсов

#java #android #maven #gradle #kotlin

#java #Android #maven #gradle #котлин #kotlin

Вопрос:

Я работаю над библиотекой Android с закрытым исходным кодом (опубликованной как AAR) и хочу включить некоторые javadocs для потребителей, для чего требуется sources.jar .

Я знаю, что мог бы выбрать каждый файл, используя includes свойство или, возможно, даже целый пакет / папку.

 task('androidSourcesJar', type: Jar) {
    classifier = 'sources'
    baseName = artifactBaseName
    from android.sourceSets.main.java.srcDirs
    include ('MyInterface1.kt', 'MyInterface2.kt', 'MyInterface3.kt')
}
  

Вместо этого есть ли способ включить только public классы, интерфейсы, методы и т.д.? Это похоже на проблему, которая возникла бы раньше.

Комментарии:

1. Эй! Я стараюсь использовать ваше решение… Но classifier и baseName устарели… Вы знаете, что использовать вместо этого?

Ответ №1:

Вы могли бы попробовать добавить что-то подобное вместо вашего include :

 from 'src/main/java'
eachFile { currentFile ->
    String contents = new File(currentFile.getSourcePath()).text
    if(!contents.contains("public class")) {
        currentFile.exclude()
    }
}
  

Я не совсем уверен, работает ли это, но это должно указать вам правильный путь к тому, куда вы хотите пойти.

Поскольку Gradle фактически не выполняет никакого анализа кода, вы не можете просто сказать «включать только файлы, которые имеют общедоступные классы». Вместо этого вам нужно либо написать пользовательский плагин, который будет включать только общедоступные классы, либо сделать что-то вроде того, что я предоставил. Он включает в себя все из исходного каталога, но запускает немного кода для каждого файла. Сначала он получает содержимое файла, затем проверяет, содержит ли этот файл public class . В противном случае файл не имеет общедоступного класса и должен быть исключен.

Надеюсь, это поможет! Не стесняйтесь задавать любые дополнительные вопросы, если у вас есть какие.

Комментарии:

1. Да, это кажется правильным. На самом деле я использую kotlin, так что public на самом деле его там нет. Но я мог бы исключить internal , private и т.д. Или ищите interface