Maven 3:组装包含二进制资源的Jar文件

时间:2012-03-02 07:42:31

标签: maven assemblies maven-3

我已经设置了一个Maven项目,该项目包含两个子模块,一个Java Jar模块和一个使用NPanday创建Windows可执行文件的模块。我的构建工作很棒。

我遇到的问题是,我想创建一个包含我的Java库的Jar文件,并嵌入了Exe文件,以便我可以从lib中的代码中将其作为资源加载。

似乎程序集插件将成为可行的路径,但我在配置它时遇到了一些麻烦。在这种情况下,我甚至不知道这是否正确。

请有人在这里指导我走正确的路径或者给我一个关于这样的汇编描述符应该是什么样子的提示吗?

克里斯

2 个答案:

答案 0 :(得分:0)

我有一个Java项目,现在只包含一个测试类,因为我还处于设置构建的阶段:

模块de.cware.utils:lib-psexec-client:

  • /de/cware/utils/psexec/client/Test.java

模块de.cware.utils:lib-psexec-service: 输出一个名为“service.exe”的文件

我希望输出看起来像客户端jar,但也要包含“service.exe”,以便我可以从客户端jar中的代码加载它。

模块de.cware.utis:lib-psexec-assembly:

  • /de/cware/utils/psexec/client/Test.java
  • /service.exe

答案 1 :(得分:0)

好的......所以我似乎自己解决了一个解决方案。我知道这个问题再次相对特殊......因为我的所有问题似乎都是: - )

解决方案是创建一个maven模块,其中包含PlexusIoResourceCollection的自定义实现,并从“META-INF / plexus”目录中的components.xml文件引用它。

将此作为依赖项添加到我的程序集插件后,我能够将exe文件嵌入到我的jar中: - )

以下是组件的代码:

package npanday.plugin.archiver;

import org.codehaus.plexus.components.io.resources.PlexusIoCompressedFileResourceCollection;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created with IntelliJ IDEA.
 * User: cdutz
 * Date: 02.03.12
 * Time: 12:04
 */
public class PlexusIoExeResourceCollection extends PlexusIoCompressedFileResourceCollection {

    @Override
    protected String getDefaultExtension() {
        return ".exe";
    }

    @Override
    protected InputStream getInputStream(File file) throws IOException {
        // Simply return an InputStream to the resource file.
        // This will make it embed the source as a whole.
        return new FileInputStream(file);
    }

    @Override
    public String getPath() {
        // Without overriding this, the exe would be included with its full path.
        // This way it is included directly in the root of the result archive.
        return super.getFile().getName();
    }

}

这里是META-INF / plexus / components.xml中的config xml

<component-set>
    <components>
        <component>
              <role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
              <role-hint>exe</role-hint>
              <implementation>npanday.plugin.archiver.PlexusIoExeResourceCollection</implementation>
              <instantiation-strategy>per-lookup</instantiation-strategy>
            </component>
    </components>
</component-set>

最后在我的程序集插件中使用:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.apache.npanday.plugins</groupId>
                    <artifactId>maven-exe-archiver-plugin</artifactId>
                    <version>${npanday.version}</version>
                </dependency>
            </dependencies>
        </plugin>

希望它能为我做到这一点。