Maven 程序集插件破坏 exe dll
Maven Assembly Plugins corrupts exe dll
我正在尝试创建一个 zip 文件,其中包含我的 Java 项目的其他内容,一个 .NET x64 EXE + 它的清单 + 一个 .NET DLL 依赖项。看起来 Maven 程序集插件损坏了 EXE 和 DLL。事实上,如果我尝试在提取后执行文件,我会得到 "This app can't run on this PC"(无效的 x64 windows 应用程序),但如果我复制原始文件,它们会正常工作。
我已经尝试 google 寻求解决方案但没有成功。我在 maven 文件中遗漏了什么吗?
pom.xml
中的插件声明是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/windows.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<finalName>${bundle.name}</finalName>
</configuration>
</execution>
</executions>
</plugin>
而windows.xml
内容是:
<?xml version="1.0"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>windows</id>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<source>${launcher.dir}/GetMachineId.exe</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>GetMachineId.exe</destName>
</file>
<file>
<source>${launcher.dir}/GetMachineId.exe.config</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>GetMachineId.exe.config</destName>
</file>
<file>
<source>${launcher.dir}/MessagingToolkit.QRCode.dll</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>MessagingToolkit.QRCode.dll</destName>
</file>
</files>
</assembly>
找到问题。
我实际上也在 ${launcher.dir}
上使用 maven-resources-plugin
过滤。
从过滤中排除二进制文件解决了问题。
更新:
在我的 pom.xml 中,maven-resources-plugin
配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>filtering-launcher-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${launcher.dir}</outputDirectory>
<resources>
<resource>
<directory>src/main/launcher</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
src/main/launcher
错误地同时包含文本文件(实际上需要过滤)和二进制文件(GetMachineId.exe
、GetMachineId.exe.config
、MessagingToolkit.QRCore.dll
)。
为了解决这个问题,我将这些二进制文件移动到不同的文件夹 (utils
) 并修改了程序集文件,如下所示:
<?xml version="1.0"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>windows</id>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<source>utils/GetMachineId.exe</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>GetMachineId.exe</destName>
</file>
<file>
<source>utils/GetMachineId.exe.config</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>GetMachineId.exe.config</destName>
</file>
<file>
<source>utils/MessagingToolkit.QRCode.dll</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>MessagingToolkit.QRCode.dll</destName>
</file>
<file>
<source>${launcher.dir}/config.xml</source>
<outputDirectory>bin</outputDirectory>
<destName>config.xml</destName>
</file>
</files>
</assembly>
这种方式 maven-resources-plugin
不会对二进制文件进行过滤处理,因此它们不会被破坏。看起来过滤过程始终将文件视为文本文件,因此它以阻止执行的方式修改二进制文件。
另一个更新的策略可能是这个:https://maven.apache.org/plugins/maven-resources-plugin/examples/binaries-filtering.html
我找到了一个更简单的解决方案,只需使用 excludes 和 includes 修改 pom.xml 标签位于 resources -> resource.
示例:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.dll</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.dll</include>
</includes>
</resource>
</resources>
我正在尝试创建一个 zip 文件,其中包含我的 Java 项目的其他内容,一个 .NET x64 EXE + 它的清单 + 一个 .NET DLL 依赖项。看起来 Maven 程序集插件损坏了 EXE 和 DLL。事实上,如果我尝试在提取后执行文件,我会得到 "This app can't run on this PC"(无效的 x64 windows 应用程序),但如果我复制原始文件,它们会正常工作。
我已经尝试 google 寻求解决方案但没有成功。我在 maven 文件中遗漏了什么吗?
pom.xml
中的插件声明是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/windows.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<finalName>${bundle.name}</finalName>
</configuration>
</execution>
</executions>
</plugin>
而windows.xml
内容是:
<?xml version="1.0"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>windows</id>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<source>${launcher.dir}/GetMachineId.exe</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>GetMachineId.exe</destName>
</file>
<file>
<source>${launcher.dir}/GetMachineId.exe.config</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>GetMachineId.exe.config</destName>
</file>
<file>
<source>${launcher.dir}/MessagingToolkit.QRCode.dll</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>MessagingToolkit.QRCode.dll</destName>
</file>
</files>
</assembly>
找到问题。
我实际上也在 ${launcher.dir}
上使用 maven-resources-plugin
过滤。
从过滤中排除二进制文件解决了问题。
更新:
在我的 pom.xml 中,maven-resources-plugin
配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>filtering-launcher-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${launcher.dir}</outputDirectory>
<resources>
<resource>
<directory>src/main/launcher</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
src/main/launcher
错误地同时包含文本文件(实际上需要过滤)和二进制文件(GetMachineId.exe
、GetMachineId.exe.config
、MessagingToolkit.QRCore.dll
)。
为了解决这个问题,我将这些二进制文件移动到不同的文件夹 (utils
) 并修改了程序集文件,如下所示:
<?xml version="1.0"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>windows</id>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<source>utils/GetMachineId.exe</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>GetMachineId.exe</destName>
</file>
<file>
<source>utils/GetMachineId.exe.config</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>GetMachineId.exe.config</destName>
</file>
<file>
<source>utils/MessagingToolkit.QRCode.dll</source>
<outputDirectory>bin/utils</outputDirectory>
<destName>MessagingToolkit.QRCode.dll</destName>
</file>
<file>
<source>${launcher.dir}/config.xml</source>
<outputDirectory>bin</outputDirectory>
<destName>config.xml</destName>
</file>
</files>
</assembly>
这种方式 maven-resources-plugin
不会对二进制文件进行过滤处理,因此它们不会被破坏。看起来过滤过程始终将文件视为文本文件,因此它以阻止执行的方式修改二进制文件。
另一个更新的策略可能是这个:https://maven.apache.org/plugins/maven-resources-plugin/examples/binaries-filtering.html
我找到了一个更简单的解决方案,只需使用 excludes 和 includes 修改 pom.xml 标签位于 resources -> resource.
示例:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.dll</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.dll</include>
</includes>
</resource>
</resources>