Как собрать несколько java-файлов в один jar-файл с помощью java-плагина gradle?

Я хочу скомпилировать несколько файлов Java в один файл JAR с Gradle.
Цель состоит в том, чтобы добавить их в банку и проверить зависимости тестов.
Maven должен интегрировать библиотеку junit.
Я также хочу применить какой-то фильтр для проверки только файлов с *Tests.java
build.gradle файл находится в том же каталоге, что и src папка.

Моя файловая структура (папки или имена файлов не могут быть изменены):

src/eu/conflicts/Conflicts.java
src/eu/conflicts/ConflictsTests.java
src/eu/utils/BuggyUtils.java
src/eu/utils/BuggyUtilsTests.java

После запуска gradle -b build.gradle jar Я получил сообщение об ошибке: Could not find the main method

apply plugin: 'java'

repositories {
   mavenCentral()
}

dependencies {
   testCompile 'junit:junit:4.12'
}

sourceSets {
   main {
      conflicts {
         srcDir = 'src/eu/conflicts'
      }
      utils {
         srcDir = 'src/eu/utils'
      }
   }

   test {
      conflicts {
         srcDir = 'src/eu/conflicts'
      }

      utils {
         srcDir = 'src/eu/utils'
      }
   }
}

jar {
   baseName = 'xy'
   version = '0.1'
   manifest {
      attributes("Implementation-Title": "xy",
                 "Implementation-Version": 0.1)
   }
}

2 ответа

Решение

Ваше определение наборов источников неверно. Плагин Java поддерживает только java а также resources типы источников в исходном наборе. Каждый исходный набор может иметь произвольное имя. Если вы назовете свой исходный набор main он будет настраивать тот, который используется соглашением задачей jar. Так:

apply plugin: 'java'

sourceSets {
  main {
    java {
      srcDir 'src'
      exclude '**/*Tests.java'
    }
  }

  test {
    java {
      srcDir 'src'
      include '**/*Tests.java'
    }
  }
}

Ваши исходные наборы кажутся неверными, и вам не нужно вносить поправки в задачу jar, если вас не беспокоит строящийся артефакт.

  • Для запуска всех тестов и компиляции ваших файлов вам просто нужно запустить build задача, это зависит от assemble а также check который зависит от других задач, таких как test, compile и т. д. Чтобы использовать его вам нужно apply plugin: 'java',

  • Gradle создаст один артефакт (если вы используете задачу сборки), компилируя все, что вы хотите, по умолчанию упаковывая ваши основные источники в банку без тестовых источников.

  • Gradle собирается запустить все тесты в исходных текстах тестов (с использованием тестовой задачи, связанной с задачей сборки), обнаруженных с помощью аннотаций.

  • Вы можете изменить все это, используя SourceSets{} в вашем скрипте, чтобы указывать на структуры не по умолчанию

Попробуйте возможно это:

sourceSets {
    main.java{ 
        srcDirs = ['src/eu/conflicts', 'src/eu/utils'] 
        include '**/*.java'
    }

    test.java{
        srcDirs = ['src/eu/conflicts', 'src/eu/utils'] 
        include  '**/*Tests.java'
    }
}
Другие вопросы по тегам