Использование 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
Я могу, конечно, скачать и установить эти банки. Проблема двоякая:
- jai_imageio требует две банки;
- jai_imageio требует установки собственной библиотеки и установки двух переменных окружения.
Я не нашел способ сделать эту работу с Maven.
См. Чтение изображений JCS_YCCK с использованием ImageIO по той причине, что я использую JAI.
8 ответов
Что я не смог увидеть, так это то, что зависимость JAI нужно было удовлетворять только во время выполнения, и поэтому я убедился, что производственная среда имеет доступ к JAI, настроив его для Tomcat.
Чтобы не выгружать банки и не устанавливать их, вы можете добавить зависимость от весеннего репо. Поэтому немного измените нормальную зависимость:
<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>
И теперь он должен работать (он делает все классы солнца доступными javax.media.jai.*). Посмотреть здесь:
Вы также можете добавить зависимость кодека при необходимости...
Существует "автономная" реализация 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 -forcecer для проверки того, что параметры среды есть.
Лицензия на jai_imageio не позволяет распространять ее.
URL-адрес хранилища в ответе Мануну, похоже, изменился или, по крайней мере, временно недоступен, что приводит к сбою сборки 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>
<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
Это сработало для меня:
<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. Его использование описано здесь и здесь. Обратите внимание на дополнительные строки во 2-й ссылке, потому что они необходимы. Вот дополнительный код, чтобы пойти в вашем 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.
Попробуй это:
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai_imageio</artifactId>
<version>1.1</version>
<type>pom</type>
</dependency>
Я добавляю эти зависимости в свой файл 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