Использование 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.
Решение 5
Чего я не увидел, так это того, что зависимость JAI должна удовлетворяться только во время выполнения, и поэтому я убедился, что производственная среда имеет доступ к JAI, настроив ее для Tomcat.
Другие советы
Чтобы избежать загрузки и установки 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.*).Глянь сюда:
При необходимости вы также можете добавить зависимость кодека...
Существует «автономная» реализация JAI-imageio, без зависимостей от jai_core.Для вашего JDK и JRE не требуется установка JAI, только одна зависимость 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 чтобы убедиться, что настройки среды существуют.
А лицензия поскольку 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-coverage зависит от 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.
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>com.sun.media</groupId>
<artifactId>jai_imageio</artifactId>
<version>1.1</version>
<type>pom</type>
</dependency>