如何打包资源,以便可以从其他Maven工件访问它们?

时间:2014-05-01 13:55:28

标签: java maven maven-3

我正在编写一个由

组成的系统
  1. 专有的闭源核心组件和
  2. 几个插件,我打算用他们的来源分发。
  3. 目前,这些只是Maven项目,我们说myapp-core(专有)和myapp-plugin1(与源代码一起分发)。

    myapp-plugin1以下列方式使用myapp-coremyapp-plugin1中有一个主要类:

    public class DisplayHouseholdsOnMapApp {
        public static void main(final String[] aArgs) {
            CoreApp app = new CoreApp();
    
            try {
                app.run(new MenuBarFactory(), new GlassPaneDisplay());
            } catch (final IOException | ClassNotFoundException | SQLException exception) {
                exception.printStackTrace();
            }
        }
    
    }
    

    CoreAppmyapp-core项目中定义,其他所有内容(MenuBarFactoryGlassPaneDisplay) - 在myapp-plugin1项目中定义。

    CoreApp.run内部发生了几件事。除其他外,它尝试从存储在myapp-core/src/main/resources文件夹中的文件加载数据。

    当我启动myapp-plugin1时,我收到错误 - myapp-core中定义的类无法加载该文件夹中定义的文件。

    现在我使用像

    这样的结构读取这些数据
    import com.google.common.io.Files;
    
    final List<String> lines = Files.readLines(aFile, Charsets.UTF_8);
    

    当我在myapp-core中使用该项目时,如何在myapp-plugin1中阅读这些文件以便它可以正常工作?

    更新1:堆栈跟踪。

    java.io.FileNotFoundException: src\main\resources\XXXX.csv (Das System kann den angegebenen Pfad nicht finden)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:131)
        at com.google.common.io.Files$FileByteSource.openStream(Files.java:127)
        at com.google.common.io.Files$FileByteSource.openStream(Files.java:117)
        at com.google.common.io.ByteSource$AsCharSource.openStream(ByteSource.java:404)
        at com.google.common.io.CharSource.getInput(CharSource.java:87)
        at com.google.common.io.CharSource.getInput(CharSource.java:63)
        at com.google.common.io.CharStreams.readLines(CharStreams.java:325)
        at com.google.common.io.Files.readLines(Files.java:747)
        at com.google.common.io.Files.readLines(Files.java:718)
    
    18:19:29.896 [AWT-EventQueue-0] ERROR r.a.c.p.impl.gui.PrimCityGlassPane - 
    java.io.FileNotFoundException: src\main\resources\XXX.csv (Das System kann die angegebene Datei nicht finden)
        at java.io.FileInputStream.open(Native Method) ~[na:1.8.0-ea]
        at java.io.FileInputStream.<init>(FileInputStream.java:131) ~[na:1.8.0-ea]
        at com.google.common.io.Files$FileByteSource.openStream(Files.java:127) ~[guava-15.0.jar:na]
        at com.google.common.io.Files$FileByteSource.openStream(Files.java:117) ~[guava-15.0.jar:na]
        at com.google.common.io.ByteSource$AsCharSource.openStream(ByteSource.java:404) ~[guava-15.0.jar:na]
        at com.google.common.io.CharSource.getInput(CharSource.java:87) ~[guava-15.0.jar:na]
        at com.google.common.io.CharSource.getInput(CharSource.java:63) ~[guava-15.0.jar:na]
        at com.google.common.io.CharStreams.readLines(CharStreams.java:325) ~[guava-15.0.jar:na]
        at com.google.common.io.Files.readLines(Files.java:747) ~[guava-15.0.jar:na]
        at com.google.common.io.Files.readLines(Files.java:718) ~[guava-15.0.jar:na]
    

    更新2:

    我尝试使用以下代码读取数据。

    import com.google.common.io.Resources;
    import com.google.common.base.Charsets;
    
    final URL resource = getClass().getClassLoader().getResource(aFile.getPath().substring
            ("src\\main\\resources\\".length()));
    final List<String> lines = Resources.readLines(resource, Charsets.UTF_8);
    

    但是现在,当我运行myapp-plugin1时,我会遇到异常。

    Exception in thread "main" java.lang.NullPointerException
        at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:192)
        at com.google.common.io.Resources$UrlByteSource.<init>(Resources.java:79)
        at com.google.common.io.Resources$UrlByteSource.<init>(Resources.java:74)
        at com.google.common.io.Resources.asByteSource(Resources.java:68)
        at com.google.common.io.Resources.asCharSource(Resources.java:113)
        at com.google.common.io.Resources.newReaderSupplier(Resources.java:104)
        at com.google.common.io.Resources.readLines(Resources.java:154)
        at com.google.common.io.Resources.readLines(Resources.java:176)
    

1 个答案:

答案 0 :(得分:0)

当然,您可以在具有依赖关系的其他工件中使用一个工件但是您需要资源。 所以在这里你可以如何做,使用maven-dependency-plugin与目标:unpack,注意你在一个阶段解压缩,因为你需要它们。您可以将所有解压缩的人员放在outputDirectory = target / classes中 这是一个使用maven-dependency-plugin解压缩两个工件的示例:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>org...</groupId>
                        <artifactId>...</artifactId>
                        <version>...</version>
                        <type>jar</type>
                        <overWrite>true</overWrite>
                        <outputDirectory>target/classes</outputDirectory>
                        <includes>**/*.class,**/*.xml</includes>
                    </artifactItem>
                    <artifactItem>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                        <version>...</version>
                        <type>jar</type>
                        <overWrite>true</overWrite>
                        <outputDirectory>target/classes</outputDirectory>
                        <includes>**/*.class</includes>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>