【问题标题】:Using Java Advanced Imaging with Maven在 Maven 中使用 Java 高级映像
【发布时间】:2009-07-30 21:45:03
【问题描述】:

JAI setup 相当繁琐,涉及多个 jar 和环境变量。如果我可以将它添加为常规的 Maven 依赖项,它将大大有助于项目的可移植性。

我使用的 POM sn-p 是

<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 需要安装本机库并设置两个环境变量。

我还没有找到使用 Maven 进行这项工作的方法。


请参阅Reading JCS_YCCK images using ImageIO,了解我使用 JAI 的原因。

【问题讨论】:

    标签: java maven-2 jai


    【解决方案1】:

    为避免下载和安装 jar,您可以添加对 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

    【讨论】:

    • 也许这在 2011 年有效,但现在不行了,这些东西根本不存在。
    • 这似乎不包括所需的imageio
    • 请注意这在 IDEA 中不起作用,因为它不喜欢包名为 javax 的事实。因此,如果您从链接中获取 jar 文件并将其添加到项目中,它将起作用。
    • 曾在我的 IDEA 2020.2 社区工作。刚刚添加了存储库和上面提到的后续依赖项。对我来说,获取真正的存储库 URL 只是一个麻烦。
    【解决方案2】:

    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>
    

    详情请见its site

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

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

    【讨论】:

    【解决方案3】:

    您需要下载 jars 并将它们安装在本地 maven 存储库或本地存储库代理服务器 (Nexus/Artifactory) 中。我认为您可以使用maven-enforcer-plugin 来验证环境设置是否存在。

    jai_imageio 的 licence 不允许为 distributed

    【讨论】:

    • 感谢您的回答。我很害怕,但我想我需要为它创建自己的 POM。
    • 文件的 POM 已经存在。 mirrors.ibiblio.org/pub/mirrors/maven2/com/sun/media/… 它确实具有 jai_core 所需的依赖关系。缺点是它在分发管理中有那个downloadURL。
    • 如果您关心将项目部署到 Maven Central,这是正确的答案。 MC 不允许依赖此处其他一些答案提供的第三方存储库。
    【解决方案4】:

    这对我有用:

    <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-coverage 依赖于 jai_imageio,所以它为我安装了合适的 jars。我什至不必更改代码即可使用此工件。

    这将使您的代码在您的 IDE 中运行。但是,如果你想要一个可执行的 jar,那么你需要使用 Maven Shade 插件。 herehere 描述了它的使用。请注意第二个链接中的额外行,因为它们是必要的。这是你的 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 中所做的工作。

    【讨论】:

    • 除非您需要项目中的 geotools 库,否则将其添加为依赖项作为获得 jai-codec 的变通方法似乎是一个糟糕的解决方案。
    【解决方案5】:

    manunu 回答中的存储库 url 似乎已更改或至少 暂时不可用,这会导致 maven 构建失败。作为替代方案,可以使用以下网址:

    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>
    

    【讨论】:

    • 我想让你知道你是最棒的
    • 不过,实际上,如果您从 @manunu 的回答 github.com/stain/jai-imageio-core 查看 Github 站点,您会在 README 中看到依赖项,它不需要 repo(我测试过)
    【解决方案6】:
    <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。

    【讨论】:

    • 这对我也适用于 maven。但是在我搬到 gradle 之后它不起作用
    【解决方案7】:

    我没有看到 JAI 依赖项只需要在运行时满足,因此我通过为 Tomcat 配置它来确保生产环境可以访问 JAI。

    【讨论】:

    • 先生,我在运行时遇到了问题。 tomcat 找不到类文件。我偶尔会收到 NoClassDefFoundError ,什么是正确的解决方案,即如何配置 tomcat 以便它始终获得类定义?我正在使用这 3 个文件 jai codec 1.1.3 jai core 1.1.3 jai imageio 1.2
    【解决方案8】:

    试试这个:

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

    【讨论】:

      【解决方案9】:

      我在我的 pom 文件中添加了这个依赖项:

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

      来自https://openmeetings.apache.org/openmeetings-web/dependencies.html

      【讨论】:

        猜你喜欢
        • 2014-08-23
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多