jasperreports_extension.properties 被 maven 程序集插件覆盖
jasperreports_extension.properties overwritten by maven assembly plugin
为了拥有一个可执行的 jar,我包含了 maven 依赖项。一切正常,但 jasperreports_extension.properties
。 Jasper 已经有一个默认的替代我的。
我想知道如何将两个文件(默认文件和自定义文件)合并到 jar 文件中。实际上我已经手动组合了这两个设置,现在我想找到一种方法来用我已有的合并文件替换程序集插件复制的文件。
这是我当前的 maven 程序集插件设置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven-assembly-plugin.version}</version>
<configuration>
<archive>
<manifest>
<mainClass>
com.test.sample.MainClass
</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
这些是我为报告添加一些字体的自定义设置:
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.ireportfamily1453367638844=fonts/fontsfamily1453367638844.xml
以及依赖关系:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.2.0</version>
</dependency>
编辑:
考虑 dependencies:
jasperreports_extension.properties
在里面(根级别)
jasperreports-6.2.0.jar
jasperreports_extension.properties
在里面(根级别)
jasperreports-fonts-6.0.0.jar
(这只是一个测试依赖)
我用 shade one 替换了 assembly 插件后,我报告的最初问题已经解决,但是我得到了这个新问题:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: no manifiest section for signature file entry org/bouncycastle/mail/smime/SMIMEEnvelopedGenerator$EnvelopedGenerator.class
at sun.security.util.SignatureFileVerifier.verifySection(Unknown Source)
at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source)
at sun.security.util.SignatureFileVerifier.process(Unknown Source)
at java.util.jar.JarVerifier.processEntry(Unknown Source)
at java.util.jar.JarVerifier.update(Unknown Source)
at java.util.jar.JarFile.initializeVerifier(Unknown Source)
at java.util.jar.JarFile.getInputStream(Unknown Source)
at sun.misc.URLClassPath$JarLoader.getInputStream(Unknown Source)
at sun.misc.Resource.cachedInputStream(Unknown Source)
at sun.misc.Resource.getByteBuffer(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access0(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
我解决了这个签名问题:"Invalid signature file" when attempting to run a .jar
根据您的问题,我假设您有一个名为 jasperreports_extension.properties
的文件作为您项目的资源,位于 src/main/resources
中。因为您依赖于 jasperreports
而恰好在 class 路径的根目录下有一个名为 jasperreports_extension.properties
的资源,所以当您制作 jar-with-dependencies
.
要解决这个问题,您应该删除 maven-assembly-plugin
并使用 maven-shade-plugin
instead. This plugin provides out of the box a transformer that is able to merge two properties file together:通过合并,我的意思是将其中一个文件附加到另一个文件的末尾:
Some jars contain additional resources (such as properties files) that have the same file name. To avoid overwriting, you can opt to merge them by appending their content into one file.
在这种情况下,示例配置为:
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>jasperreports_extension.properties</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.test.sample.MainClass</mainClass>
</transformer>
</transformers>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
这将生成一个最终的胖 JAR,其中 jasperreports_extension.properties
的内容将是您的文件和来自依赖项的文件的内容。
此外,它也会有一个正确的 MANIFEST
,因为我们向插件指定了哪个 class 是主要的 class。
附带说明一下,当您制作胖 JAR 时,maven-assembly-plugin
仅提供基本支持。 From their homepage:
If your project wants to package your artifact in an uber-jar, the assembly plugin provides only basic support. For more control, use the Maven Shade Plugin.
为了拥有一个可执行的 jar,我包含了 maven 依赖项。一切正常,但 jasperreports_extension.properties
。 Jasper 已经有一个默认的替代我的。
我想知道如何将两个文件(默认文件和自定义文件)合并到 jar 文件中。实际上我已经手动组合了这两个设置,现在我想找到一种方法来用我已有的合并文件替换程序集插件复制的文件。
这是我当前的 maven 程序集插件设置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven-assembly-plugin.version}</version>
<configuration>
<archive>
<manifest>
<mainClass>
com.test.sample.MainClass
</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
这些是我为报告添加一些字体的自定义设置:
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.ireportfamily1453367638844=fonts/fontsfamily1453367638844.xml
以及依赖关系:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.2.0</version>
</dependency>
编辑:
考虑 dependencies:
jasperreports_extension.properties
在里面(根级别)jasperreports-6.2.0.jar
jasperreports_extension.properties
在里面(根级别)jasperreports-fonts-6.0.0.jar
(这只是一个测试依赖)
我用 shade one 替换了 assembly 插件后,我报告的最初问题已经解决,但是我得到了这个新问题:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: no manifiest section for signature file entry org/bouncycastle/mail/smime/SMIMEEnvelopedGenerator$EnvelopedGenerator.class
at sun.security.util.SignatureFileVerifier.verifySection(Unknown Source)
at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source)
at sun.security.util.SignatureFileVerifier.process(Unknown Source)
at java.util.jar.JarVerifier.processEntry(Unknown Source)
at java.util.jar.JarVerifier.update(Unknown Source)
at java.util.jar.JarFile.initializeVerifier(Unknown Source)
at java.util.jar.JarFile.getInputStream(Unknown Source)
at sun.misc.URLClassPath$JarLoader.getInputStream(Unknown Source)
at sun.misc.Resource.cachedInputStream(Unknown Source)
at sun.misc.Resource.getByteBuffer(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access0(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
我解决了这个签名问题:"Invalid signature file" when attempting to run a .jar
根据您的问题,我假设您有一个名为 jasperreports_extension.properties
的文件作为您项目的资源,位于 src/main/resources
中。因为您依赖于 jasperreports
而恰好在 class 路径的根目录下有一个名为 jasperreports_extension.properties
的资源,所以当您制作 jar-with-dependencies
.
要解决这个问题,您应该删除 maven-assembly-plugin
并使用 maven-shade-plugin
instead. This plugin provides out of the box a transformer that is able to merge two properties file together:通过合并,我的意思是将其中一个文件附加到另一个文件的末尾:
Some jars contain additional resources (such as properties files) that have the same file name. To avoid overwriting, you can opt to merge them by appending their content into one file.
在这种情况下,示例配置为:
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>jasperreports_extension.properties</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.test.sample.MainClass</mainClass>
</transformer>
</transformers>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
这将生成一个最终的胖 JAR,其中 jasperreports_extension.properties
的内容将是您的文件和来自依赖项的文件的内容。
此外,它也会有一个正确的 MANIFEST
,因为我们向插件指定了哪个 class 是主要的 class。
附带说明一下,当您制作胖 JAR 时,maven-assembly-plugin
仅提供基本支持。 From their homepage:
If your project wants to package your artifact in an uber-jar, the assembly plugin provides only basic support. For more control, use the Maven Shade Plugin.