首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImageIO PSD库插件不能在jar内工作

ImageIO PSD库插件不能在jar内工作
EN

Stack Overflow用户
提问于 2018-12-29 13:21:13
回答 1查看 375关注 0票数 1

我正在使用ImageIO,我正在尝试将代码打包到一个JAR中,但是,我发现(经过一些调试) PSD插件不在打包的JAR中。

我发现是因为这个答案中的代码:Add/remove ImageReader from jar to ImageIO-registry

在我的pom.xml中,我有以下ImageIO依赖项:

代码语言:javascript
复制
   <dependency>
        <groupId>com.twelvemonkeys.imageio</groupId>
        <artifactId>imageio-bmp</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>com.twelvemonkeys.imageio</groupId>
        <artifactId>imageio-psd</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>com.twelvemonkeys.imageio</groupId>
        <artifactId>imageio-core</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>com.twelvemonkeys.imageio</groupId>
        <artifactId>imageio-metadata</artifactId>
        <version>3.4</version>
    </dependency>

我使用的maven命令是:

代码语言:javascript
复制
clean compile assembly:single

请注意我用来调试的代码:

代码语言:javascript
复制
        ImageIO.scanForPlugins()
        IIORegistry.getDefaultInstance().registerApplicationClasspathSpis()
        val ir = ImageIO.getImageReadersByFormatName("PSD")
        while (ir.hasNext())
        {
            val r = ir.next() as ImageReader
            println(r)
        }

在IDE打印中:

代码语言:javascript
复制
com.twelvemonkeys.imageio.plugins.psd.PSDImageReader@1963006a

当从命令行运行jar时,它不会打印任何东西,这使我相信PSD插件不是在JAR内部工作,而是如何工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-29 14:49:56

问题是,目标assembly:single将您自己项目中的“所有东西”合并到一个JAR中,但是跳过了那里存在的文件。

ImageIO依赖于Java的SPI/服务加载器机制,因此插件将通过META-INF\services\javax.imageio.spi.ImageReaderSpi加载。但是,当使用这样一个文件拥有多个JAR并使用assembly:single时,其中一个文件将“胜利”,而来自其他JAR的文件将被跳过。在您的项目中,imageio-bmpimageio-psd都有这样的文件,第一个文件在最终的JAR中“获胜”。(看起来IDE以另一个顺序加载这些文件,正确的版本"wins",但这只是猜测)。

解决方案: Maven应该将所有META-INF\services\javax.imageio.spi.ImageReaderSpi文件合并到结果JAR中的一个文件中。为此,Maven需要更多的配置信息。

  1. 将文件descriptor.xml添加到项目的根目录中,如下所示:
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <!-- copied from jar-with-dependencies (http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html#jar-with-dependencies) -->
    <id>jar-with-deps-merge-services</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <containerDescriptorHandlers>
        <containerDescriptorHandler>
            <handlerName>metaInf-services</handlerName>
        </containerDescriptorHandler>
    </containerDescriptorHandlers>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

重要的部分是metaInf-services设置,它将文件合并到META-INF\services中。

  1. descriptor.xml中添加对pom.xml的引用
代码语言:javascript
复制
[...]
<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>your.main.MainClass</mainClass>
                    </manifest>
                </archive>
                <descriptors>
                    <descriptor>descriptor.xml</descriptor>
                </descriptors>
            </configuration>
        </plugin>
    </plugins>
</build>

重要说明:

  • maven程序集插件版本应该是2.2.1,因为当前的3.x版本似乎不起作用。但是,如果确实需要,您可以尝试更新的2.2.x或2.x版本。我只试过2.2.1,而且效果很好。
  • 如果需要,必须根据主类名更改主类块。
  • 描述符文件可以放在项目中的不同目录中,但是必须更改pom中的引用(它相对于maven项目的根)。
  • 如果您的构建配置中有jar-with-dependencies,则应该将其删除,因为描述符文件包括该设置。

即使我在一个示例项目上尝试了这一点,这个解决方案可能并不完美,您可能会根据您的需要对其进行调整,但我希望这是一个合适的起点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53969942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档