Использование Java Advanced Imaging с Maven

Настройка JAI - это довольно утомительно, включая несколько jar-файлов и переменных окружения. Это очень помогло бы переносимости проекта, если бы я мог добавить его как обычную зависимость 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 требует двух банок;
  • jai_imageio требует, чтобы была установлена ​​собственная библиотека и были установлены две переменные среды.

Я не нашел способа заставить эту работу с Maven.


См. Чтение изображений JCS_YCCK с помощью ImageIO, по причине того, что я использую JAI.


person Robert Munteanu    schedule 30.07.2009    source источник


Ответы (9)


Чтобы избежать загрузки 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

person Lol    schedule 29.10.2011
comment
Возможно, это сработало в 2011 году, но сейчас нет, этого просто нет. - person Tilman Hausherr; 14.03.2014
comment
похоже, это не включает требуемый imageio - person Don Cheadle; 01.04.2015
comment
Обратите внимание, что это не работает в IDEA, потому что ему не нравится, что имя пакета - javax. Так что, если вы получите файл jar по ссылке и добавите его в проект, он будет работать. - person Stepan Yakovenko; 03.10.2016
comment
Работал в моем сообществе IDEA 2020.2 .. Просто добавил репозиторий и более позднюю зависимость, упомянутую выше. Для меня было проблемой получить реальный URL-адрес репозитория. - person BlueDev; 19.04.2021

Существует «автономная» реализация 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>
person manuna    schedule 19.01.2012
comment
оказывается, что часть <repository> может быть устаревшей, но README на странице GitHub имеет ‹dependency›, не требует дополнительного репо - person Don Cheadle; 01.04.2015

Вам нужно будет загрузить jar-файлы и установить их в локальном репозитории maven или на прокси-сервере локального репозитория (Nexus / Artifactory). Я думаю, вы можете использовать maven-enforcer-plugin, чтобы проверить, что среда настройки есть.

лицензия для jai_imageio не разрешите его распространить.

person Mike Cornell    schedule 31.07.2009
comment
Спасибо за ответ. Я боялся этого, но, думаю, мне нужно создать для этого свои собственные POM. - person Robert Munteanu; 31.07.2009
comment
Ну, POM для файлов уже существует. mirrors.ibiblio.org/ pub / mirrors / maven2 / com / sun / media / У него есть необходимая зависимость от jai_core. Обратной стороной является то, что у него есть downloadURL в управлении распространением. - person Mike Cornell; 31.07.2009
comment
Это правильный ответ, если вы хотите развернуть свой проект в Maven Central. MC не позволяет полагаться на сторонние репозитории, которые предлагают некоторые из других ответов здесь. - person Leif Gruenwoldt; 31.08.2013

Это сработало для меня:

<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.

person GregNash    schedule 13.02.2012
comment
Если вам не нужна библиотека geotools в вашем проекте, добавление ее в качестве зависимости в качестве обходного пути для получения jai-кодека кажется плохим решением. - person Leif Gruenwoldt; 31.08.2013

URL-адрес репозитория в ответе manunu, похоже, изменился или, по крайней мере, временно недоступен, что приводит к сбою сборки maven. В качестве альтернативы можно использовать следующий 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>
person Chris2M    schedule 13.05.2014
comment
Я хочу, чтобы ты знала, что ты лучший - person Don Cheadle; 01.04.2015
comment
хотя на самом деле, если вы посмотрите на сайт Github из ответа @manunu, github.com/stain/ jai-imageio-core вы видите зависимость в README, которая не требует репо (я ее тестировал) - person Don Cheadle; 01.04.2015

<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.

person Swarit Agarwal    schedule 18.11.2014
comment
Это сработало и для меня для maven. Но после того, как я перешел в Gradle, он не работает - person Amol Suryawanshi; 30.04.2020

Чего я не увидел, так это того, что зависимость JAI должна быть удовлетворена только во время выполнения, и поэтому я убедился, что производственная среда имеет доступ к JAI, настроив ее для Tomcat.

person Robert Munteanu    schedule 31.07.2009
comment
сэр, у меня проблемы во время выполнения. tomcat не может найти файл класса. Иногда я получаю NoClassDefFoundError, какое правильное решение, т.е. как настроить tomcat, чтобы он всегда получал определение класса? Я использую эти 3 файла jai codec 1.1.3 jai core 1.1.3 jai imageio 1.2 - person gursahib.singh.sahni; 04.10.2013

попробуй это:

<dependency>
  <groupId>com.sun.media</groupId>
  <artifactId>jai_imageio</artifactId>
  <version>1.1</version>
  <type>pom</type>
</dependency>
person I-yorn-man    schedule 30.07.2010

Я добавляю эти зависимости в свой файл 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

person edilon Junior    schedule 20.07.2019