jasperreports_extension.properties由maven程序集插件覆盖

为了拥有一个可执行jar,我包含了maven依赖项。 一切正常,但jasperreports_extension.properties 。 Jasper已经有一个替换我的默认值。

我想知道如何将两个文件(默认文件和自定义文件)组合到jar文件中。 实际上我已经手动组合了两个设置,现在我想找到替换程序集插件复制的文件的方法,我已经合并了。

这是我当前的maven程序集插件设置:

    org.apache.maven.plugins maven-assembly-plugin ${maven-assembly-plugin.version}     com.test.sample.MainClass     jar-with-dependencies      

这些是我在报告中添加一些字体的自定义设置:

 net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory net.sf.jasperreports.extension.simple.font.families.ireportfamily1453367638844=fonts/fontsfamily1453367638844.xml 

和依赖:

  net.sf.jasperreports jasperreports 6.2.0  

编辑:

考虑依赖性 :

  • jasperreports-6.2.0.jar位于(根级别) jasperreports-6.2.0.jar
  • jasperreports-fonts-6.0.0.jar位于(根级别) jasperreports-fonts-6.0.0.jar (这只是一个Test Dependencies)

在我用一个阴影替换了程序集插件之后,我报告的初始问题是固定的,但是我得到了这个新问题:

  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$2.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.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.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) 

我在尝试运行.jar后解决了这个签名问题: “无效的签名文件”

我假设你的问题是你有一个名为jasperreports_extension.properties的文件作为项目的资源,位于src/main/resources 。 因为你依赖于jasperreports ,而且恰好在类路径的根目录中有一个名为jasperreports_extension.properties的资源,所以当你创建jar-with-dependencies时,会覆盖另一个。

要解决这个问题,你应该删除maven-assembly-plugin并使用maven-shade-plugin代替。 这个插件提供了一个开箱即用的变换器,它能够将两个属性文件合并在一起 :通过合并,我的意思是其中一个文件被附加到另一个文件的末尾:

某些jar包含具有相同文件名的其他资源(例如属性文件)。 为避免覆盖,您可以选择通过将其内容附加到一个文件来合并它们。

在这种情况下,示例配置将是:

  maven-shade-plugin 2.4.3   package  shade     jasperreports_extension.properties   com.test.sample.MainClass   false     

这将生成一个最终的胖JAR,其中jasperreports_extension.properties的内容将是您的文件的内容和来自依赖项的文件。

此外,它还将具有正确的MANIFEST因为我们指定了插件哪个类是主类。


作为旁注,当你制作胖JAR时, maven-assembly-plugin只提供基本支持。 从他们的主页 :

如果您的项目想要将工件打包在超级jar中,则程序集插件仅提供基本支持。 要获得更多控制,请使用Maven Shade插件。