为了拥有可执行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
(这只是一个测试依赖项)在我用阴影1替换了程序集插件后,我报告的初始问题已修复,但我得到了这个新问题:
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)
我在此之后解决了这个签名问题:"Invalid signature file" when attempting to run a .jar
答案 0 :(得分:6)
我假设你的问题是你有一个名为jasperreports_extension.properties
的文件作为你项目的资源,位于src/main/resources
内。因为您对jasperreports
的依赖性也恰好在类路径的根处有一个名为jasperreports_extension.properties
的资源,所以在您创建jar-with-dependencies
时会覆盖另一个。
要解决此问题,您应该放弃maven-assembly-plugin
并改用maven-shade-plugin
。这个插件提供了开箱即用的transformer that is able to merge two properties file together:通过合并,我的意思是其中一个文件被附加到另一个文件的末尾:
某些jar包含具有相同文件名的其他资源(例如属性文件)。为避免覆盖,您可以选择通过将其内容附加到一个文件来合并它们。
在这种情况下,示例配置为:
<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
,因为我们为插件指定了哪个类是主类。
作为旁注,当您制作胖JAR时,maven-assembly-plugin
仅提供基本支持。 From their homepage:
如果您的项目想要将工件打包在超级jar中,则程序集插件仅提供基本支持。要获得更多控制,请使用Maven Shade插件。