在Maven中使用Java高级映像

JAI设置非常繁琐,涉及多个jar和环境variables。 如果我可以将它作为一个常规的Maven依赖项添加,它将有助于项目的可移植性。

我正在使用的POM片段是

<dependency> <groupId>com.sun.media</groupId> <artifactId>jai_imageio</artifactId> <version>1.1</version> </dependency> 

和错误是

 [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to resolve artifact. Missing: ---------- 1) com.sun.media:jai_imageio:jar:1.1 2) javax.media:jai_core:jar:1.1.3 

当然,我可以下载并安装这些jar子。 问题是双重的:

  • jai_imageio需要两个jar子;
  • jai_imageio需要安装本地库并设置两个环境variables。

我还没有find一个方法来使这个工作与Maven。


请参阅使用ImageIO读取JCS_YCCK图像 ,因为我正在使用JAI。

为了避免装载瓶子并安装它们,你可以添加一个对spring回购的依赖。 所以稍微改变一下正常的依赖关系:

  <dependency> <groupId>javax.media.jai</groupId> <artifactId>com.springsource.javax.media.jai.core</artifactId> <version>1.1.3</version> </dependency> 

并添加一个存储库声明:

  <repository> <id>com.springsource.repository.bundles.external</id> <name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name> <url>http://repository.springsource.com/maven/bundles/external</url> </repository> 

现在它应该可以工作(它使所有的sun类都可用javax.media.jai。*)。 看这里:

http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.javax.media.jai.core&version=1.1.3

您还可以添加编解码器依赖项,如果有必要…

http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.javax.media.jai.codec&version=1.1.3

JAI-imageio有一个“独立”的实现,不依赖于jai_core。 它不需要JAI安装到你的JDK和JRE,只有单一的Maven依赖。

在Maven中,添加它的存储库:

 <repository> <releases /> <snapshots> <enabled>false</enabled> </snapshots> <id>mygrid-repository</id> <name>myGrid Repository</name> <url>http://www.mygrid.org.uk/maven/repository</url> </repository> 

和依赖:

 <dependency> <groupId>net.java.dev.jai-imageio</groupId> <artifactId>jai-imageio-core-standalone</artifactId> <version>1.2-pre-dr-b04-2014-09-13</version> </dependency> 

查看其网站了解更多详情

PS在一个有用的评论(从gitHub不需要添加该存储库的另一个依赖项)之后更新:

 <dependency> <groupId>com.github.jai-imageio</groupId> <artifactId>jai-imageio-core</artifactId> <version>1.3.0</version> </dependency> 

您将需要下载jar并将其安装在本地maven存储库或本地存储库代理服务器(Nexus / Artifactory)中。 我想你可以使用maven-enforcer-plugin来validation环境设置在那里。

jai_imageio的许可证不允许分发 。

这对我工作:

 <dependency> <groupId>org.geotools</groupId> <artifactId>gt-coverage</artifactId> <version>2.7.4</version> </dependency> <repository> <id>osgeo</id> <name>Open Source Geospatial Foundation Repository</name> <url>http://download.osgeo.org/webdav/geotools/</url> </repository> 

看来GT覆盖取决于jai_imageio,所以它为我安装了适当的jar子。 我甚至不必改变我的代码来使用这个工件。

这将使您的代码在您的IDE中工作。 但是,如果你想要一个可执行的jar文件,那么你需要使用Maven Shade插件。 它的使用在这里和这里描述。 请注意第二个链接中的额外行,因为它们是必需的。 这是你的pom中的额外代码:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.3.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>com.companyname.packagename.MainClassName</Main-Class> <Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title> <Specification-Version>1.1</Specification-Version> <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor> <Implementation-Title>com.sun.media.imageio</Implementation-Title> <Implementation-Version>1.1</Implementation-Version> <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor> <Extension-Name>com.sun.media.imageio</Extension-Name> </manifestEntries> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin> 

我不知道所有这些额外的清单条目是什么,但他们让我的可执行jar做它在IDE中做什么。

manunu的答案中的库url似乎已经改变,或者至less暂时不可用 ,这导致maven构build失败。 作为替代,可以使用以下url:

http://build.mygrid.org.uk/maven/repository

 <repository> <releases /> <snapshots> <enabled>false</enabled> </snapshots> <id>mygrid-repository</id> <name>myGrid Repository</name> <url>http://build.mygrid.org.uk/maven/repository</url> </repository> 
 <dependency> <groupId>javax.media.jai</groupId> <artifactId>com.springsource.javax.media.jai.core</artifactId> <version>1.1.3</version> </dependency> 

并添加一个存储库声明:

 <repository> <id>com.springsource.repository.bundles.external</id> <name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name> <url>http://repository.springsource.com/maven/bundles/external</url> </repository> 

这对我有效。 猜猜可以依靠Spring Jar,它不应该像java一样移动

我没有看到的是JAI依赖需要在运行时才能满足,因此我通过将其configuration为Tomcat来确保生产环境可以访问JAI。

尝试这个:

 <dependency> <groupId>com.sun.media</groupId> <artifactId>jai_imageio</artifactId> <version>1.1</version> <type>pom</type> </dependency>