GradleでJasperReports Libraryの依存関係を解決する方法

# 前提

## ソフトウェアのバージョン

* Gradle 4.0.2
* JasperReports Library v6.4.1

# JasperReports Libraryの依存関係を解決できない問題

JasperReports LibraryはMavenのセントラルリポジトリに登録されています。
build.gradleで次のように記述することで依存関係を宣言することができます。

```groovy:build.gradle
apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'net.sf.jasperreports:jasperreports:6.4.1'
}
```

しかし、これではビルドするときにJasperReports Libraryの依存関係の一部を解決できません。[^1]

```bash
$ gradle build

FAILURE: Build failed with an exception.

* What went wrong:
Could not resolve all files for configuration ':compileClasspath'.
> Could not find com.lowagie:itext:2.1.7.js6.
  Searched in the following locations:
      https://repo1.maven.org/maven2/com/lowagie/itext/2.1.7.js6/itext-2.1.7.js6.pom
      https://repo1.maven.org/maven2/com/lowagie/itext/2.1.7.js6/itext-2.1.7.js6.jar
  Required by:
      project : > net.sf.jasperreports:jasperreports:6.4.1
> Could not find org.olap4j:olap4j:0.9.7.309-JS-3.
  Searched in the following locations:
      https://repo1.maven.org/maven2/org/olap4j/olap4j/0.9.7.309-JS-3/olap4j-0.9.7.309-JS-3.pom
      https://repo1.maven.org/maven2/org/olap4j/olap4j/0.9.7.309-JS-3/olap4j-0.9.7.309-JS-3.jar
  Required by:
      project : > net.sf.jasperreports:jasperreports:6.4.1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED in 4s
1 actionable task: 1 executed
```

# 依存関係が解決できない原因

JasperReports Libraryが依存している一部のライブラリはMavenのセントラルリポジトリではなく、別のリポジトリに登録されています。
Gradleが、そのリポジトリに登録されているライブラリを見つけられないことが依存関係を解決できない原因です。

# 依存関係を解決する方法

build.gradleを次のように変更することで依存関係を解決することができます。

```groovy:build.gradle
apply plugin: 'java'

repositories {
    mavenCentral artifactUrls: [
        'http://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/'
    ]
}

dependencies {
    compile 'net.sf.jasperreports:jasperreports:6.4.1'
}
```

# この方法で依存関係を解決できる理由

JasperReports Libraryのpom.xmlには次のような記述があります。

```xml:pom.xml
	<repositories>
		<repository>
			<id>jaspersoft-third-party</id>
			<url>http://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/</url>
		</repository>
	</repositories>
```

これはMavenのセントラルリポジトリに加えて`http://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/`へライブラリを探しに行くことを宣言しています。[^2]

先ほど見つけられなかったライブラリはこのリポジトリに登録されています。
しかしGradleはpom.xml内のrepositoriesを解析してライブラリを探すことはしません。
したがってGradleが、このリポジトリへライブラリを探しに行くように設定する必要があります。

Gradleではbuild.gradleにartifactUrlsを指定することで、探索先のリポジトリを追加できます。[^3]
今回の場合、上記のリポジトリをmavenCentralのartifactUrlsに指定することで依存関係を解決することができます。[^4]

# この方法でも解決できない場合の対処

原因は不明ですがGradle 2.12を使用する場合、環境によってはartifactUrlsを指定しても正しく動作しないことがあるようです。
そのような場合は次のことを試してみてください。

1. 使用するGradleのバージョンを変更する
2. ホームディレクトリの.gradleを削除する

[^1]: この現象を再現するには少なくとも1つのソースコードが必要です。
[^2]: repositoriesについての解説 [Maven &#x2013; Introduction to Repositories](http://maven.apache.org/guides/introduction/introduction-to-repositories.html)
[^3]: artifactUrlsについての解説 [Chapter&nbsp;23.&nbsp;Dependency Management](https://docs.gradle.org/current/userguide/dependency_management.html)
[^4]: mavenCentralの[リファレンスによる解説](https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html#org.gradle.api.artifacts.dsl.RepositoryHandler:mavenCentral(java.util.Map))