/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */ 

// See LUCENE-9411. This hack adds compile-time only dependencies
// on findbugs and error_prone annotations. Otherwise javac generates odd warnings about missing
// type information.

configure([project(":solr:core"),
           project(":solr:solrj"),
           project(":solr:contrib:prometheus-exporter"),
           project(":solr:test-framework"),
           project(":solr:contrib:analytics")]) {
  plugins.withType(JavaPlugin) {
    dependencies {
      // Use versionless variants because these libraries are in versions.lock.
      compileOnly     'com.google.errorprone:error_prone_annotations'
      testCompileOnly 'com.google.errorprone:error_prone_annotations'
      compileOnly     'com.google.code.findbugs:jsr305'
      testCompileOnly 'com.google.code.findbugs:jsr305'

      // This one isn't.
      compileOnly 'com.google.code.findbugs:annotations:3.0.1'
      testCompileOnly 'com.google.code.findbugs:annotations:3.0.1'
    }

    // Exclude these from jar validation and license checks.
    configurations.jarValidation {
      exclude group: "com.google.code.findbugs", module: "jsr305"
      exclude group: "com.google.code.findbugs", module: "annotations"
      exclude group: "com.google.errorprone", module: "error_prone_annotations"
    }
  }
}
