2012-06-09 103 views
1

我创建了一个新的Maven插件来为我正在处理的项目生成一些源文件。每个文件自然需要在每个文件顶部的公司版权信息。为尽力做到最好,我想将版权信息放在单独的文本文件中,而不是源代码中的硬编码。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是一个自定义错误消息。当类加载器返回的InputStreamnull时,它会抛出此异常。

有没有人有一个想法,我怎么能得到Maven插件读取从classpath这个java-header.txt文件?据我所知,它使用插件目录中的目标编译文件来运行插件。 java-header.txt文件就在那里。这里是URL信息的Maven还会打印出:

**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 
+1

你能告诉我们你正在使用maven插件吗? – Attila

回答

0

someClass.getResource()将返回路径MVN:的artifactId /组ID /版本。常规JVM中的r文件返回文件协议。基于OSGi的jvm将返回maven路径。

相关问题