Ответ 1
То, что я не видел, заключалось в том, что зависимость JAI была удовлетворена только во время выполнения, и поэтому я убедился, что производственная среда имеет доступ к JAI, настроив ее для Tomcat.
JAI setup довольно утомительно, включая несколько банок и переменных среды. Это могло бы облегчить переносимость проекта, если бы я мог добавить его в качестве обычной зависимости от 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
Я могу, конечно, загрузить и установить эти банки. Проблема двоякая:
Я не нашел способ сделать эту работу с Maven.
См. Чтение изображений JCS_YCCK с использованием ImageIO по той причине, что я использую JAI.
То, что я не видел, заключалось в том, что зависимость JAI была удовлетворена только во время выполнения, и поэтому я убедился, что производственная среда имеет доступ к JAI, настроив ее для Tomcat.
Чтобы избежать загрузки контейнеров и их установки, вы можете добавить зависимость от репо 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>
И теперь он должен работать (он делает все классы солнца доступными 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>
Вам нужно будет загрузить банки и установить их в локальный репозиторий maven или прокси-сервер локального репозитория (Nexus/Artifactory). Я думаю, вы можете использовать maven-enforcer-plugin, чтобы проверить, что существуют настройки среды.
лицензия для 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, поэтому он установил для меня соответствующие банки. Мне даже не пришлось менять код, чтобы использовать этот артефакт.
Это приведет к тому, что ваш код будет работать в вашей среде IDE. Однако, если вы хотите использовать исполняемую банку, вам нужно использовать плагин 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>
Я не знаю, каковы все эти дополнительные манифестные записи, но они делают мою исполняемую банку делать то, что она делает в среде IDE.
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>
<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>
Это сработало для меня. Guess может полагаться на Spring Jar, он не должен двигаться, как java did
попробуйте следующее:
<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