当前位置: 首页 > 面试题库 >

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

詹联
2023-03-14
问题内容

为了拥有可执行的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>

编辑:

考虑依赖关系:

  • 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)

我解决了以下签名问题:尝试运行.jar时出现“无效签名文件”


问题答案:

根据您的问题,我假设您有一个名为的文件jasperreports_extension.properties,位于您项目的内部src/main/resources。因为您jasperreports对此有依赖性,所以碰巧jasperreports_extension.properties在类路径的根上有一个调用的资源,因此在制作时,一个将覆盖另一个jar- with-dependencies

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

有些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仅提供基本支持。从他们的主页:

如果您的项目想要将工件打包在uber-jar中,则Assembly插件仅提供基本支持。要进行更多控制,请使用Maven Shade插件。



 类似资料:
  • 我有一个Maven插件,它在POM文件中配置为 现在我想从命令行覆盖那个,所以我运行 我可以看到的值仍然是,而不是。可以从命令行覆盖配置参数吗?

  • 我使用maven汇编插件来压缩我的web应用程序dist文件夹。我使用这个文件: 我在父pom中使用它作为依赖项,如下所示: 根据使用此父pom的子级,我想告诉您maven assembly插件必须在哪个目录中使用assembly描述符。我用

  • 我想重写maven checkstyle插件中的configLocation选项。pom.xml的示例部分是: 正如上面可以看到的,checkstyle-config是一个单独的maven项目,它包含用于样式检查的规则,用于规则的配置文件是blahblah/checkStyle/checkStyle.xml。如果我必须重写blahlah/checkstyle/checkstyle.xml并使用存储

  • 执行maven时发生以下错误(mvn clean install) 无法在项目测试上执行目标org.jacoco:jacoco-maven-plugin:0.7.2.201409121644:prepare-agent(默认值)ng:目标org.jacoco:jacoco-maven-plugin:0.7.2.201409121644:prepare-agent失败:无法在插件“org.jacoc

  • 我需要定制的工件安装,不知道如何覆盖默认的(从默认的maven生命周期)。所以我的问题是: 如何在我的pom.xml中配置maven install插件,使其不进行默认安装并执行我的自定义安装文件目标? 我尝试了没有id和默认安装id,但没有帮助。 更新:从提供的答案 - 这对我不起作用(我在日志中看到两次安装尝试)。

  • 主要内容:如下表所示,Maven 提供了如下 2 种类型的插件。,插件目标,插件绑定Maven 实际上是一个依赖插件执行的框架,它执行的每个任务实际上都由插件完成的。Maven 的核心发布包中并不包含任何 Maven 插件,它们以独立构件的形式存在, 只有在 Maven 需要使用某个插件时,才会去仓库中下载。 如下表所示,Maven 提供了如下 2 种类型的插件。 插件类型 描述 Build plugins 在项目构建过程中执行,在 pom.xml 中的 build 元素中配置