1

我创建了一个新的 Maven 插件来为我正在处理的项目生成一些源文件。每个文件的顶部自然需要公司的版权信息。尽我所能,我想把版权信息放在一个单独的文本文件中,而不是硬编码在源代码中。

在我的插件中,我试图使用getResourceAsStream()类加载器提供的方法来获取这个文件:

    InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream(
        "/com/company/java-header.txt"
    );

当我单独测试插件时,此代码有效。java-header.txt正确放置在 Maven 的目标目录中的正确位置,并且测试通过。

现在下一步,我想在另一个 Maven 模块中使用这个插件。如果我不包含每个 java 文件的版权标头,插件将按预期工作。所以我知道我编写 Maven 插件的方式不是另一个问题。

当我使用上面的代码运行插件时,我得到以下异常:

        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
        ... 20 more
Caused by: java.lang.ExceptionInInitializerError
        at com.company.AbstractJavaSchemaFile.generate(AbstractJavaSchemaFile.java:12)
        at com.company.AbstractJavaSchemaFile.generateAndWriteToFile(AbstractJavaSchemaFile.java:8)
        at com.company.SchemaGenerator.generateSchemaBaseClass(SchemaGenerator.java:41)
        at com.company.SchemaGenerator.generateSchemaFiles(SchemaGenerator.java:36)
        at com.company.SchemaGenerator.execute(SchemaGenerator.java:28)
        at com.company.SchemaGenerator.execute(SchemaGenerator.java:20)
        at com.company.SchemaGeneratorMojo.execute(SchemaGeneratorMojo.java:37)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
        ... 20 more
Caused by: com.company.SchemaGeneratorException: Cannot find [com/company/java-header.txt] in your classpath.
        at com.company.JavaSchemaFileBuilder.verifyJavaHeaderIsFoundInClassPath(JavaSchemaFileBuilder.java:47)
        at com.company.JavaSchemaFileBuilder.readJavaHeader(JavaSchemaFileBuilder.java:31)
        at com.company.JavaSchemaFileBuilder.<clinit>(JavaSchemaFileBuilder.java:15)

该错误com.company.SchemaGeneratorException: Cannot find [com/company/java-header.txt] in your classpath是自定义错误消息。当InputStream类加载器返回的是null.

有谁知道如何让 Maven 插件java-header.txt从类路径中读取这个文件?据我所知,它使用插件目录中的目标编译文件来运行插件。java-header.txt 文件在那里。这是 Maven 也打印出来的 url 信息:

**urls[0] = file:/C:/Path/to/my/project/my-maven-plugin/target/classes/**
urls[1] = file:/C:/Users/me/.m2/repository/org/codehaus/plexus/plexus-utils/2.0.6/plexus-utils-2.0.6.jar
urls[2] = file:/C:/Users/me/.m2/repository/org/codehaus/plexus/plexus-component-annotations/1.5.5/plexus-component-annotations-1.5.5.jar
urls[3] = file:/C:/Users/me/.m2/repository/org/sonatype/sisu/sisu-inject-bean/2.3.0/sisu-inject-bean-2.3.0.jar
urls[4] = file:/C:/Users/me/.m2/repository/org/sonatype/sisu/sisu-guice/3.1.0/sisu-guice-3.1.0-no_aop.jar
urls[5] = file:/C:/Users/me/.m2/repository/org/sonatype/sisu/sisu-guava/0.9.9/sisu-guava-0.9.9.jar
urls[6] = file:/C:/Users/me/.m2/repository/commons-io/commons-io/1.2/commons-io-1.2.jar
urls[7] = file:/C:/Users/me/.m2/repository/dom4j/dom4j/1.3/dom4j-1.3.jar
4

1 回答 1

0

someClass.getResource() 将返回路径为 mvn:artifactID/groupID/version。而常规 JVM 中的 r 个文件返回文件协议。基于 OSGi 的 jvm 将返回 maven 路径。

于 2012-10-18T09:41:47.940 回答