在maven中配置不同文件类型的编码?

2024-04-13

我用maven 资源插件 http://maven.apache.org/plugins/maven-resources-plugin/faq.html过滤我的 Maven 项目中的一些资源。在我的父项目中,我有:

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

在一个子项目中我有一个测试.属性文件是一个普通的文件java属性文件 http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Properties.html默认编码=ISO-8859-1。该文件包含:

aboutText=Version ${project.version} © 2012 blabla

为了确保此文件正确过滤,我已将 maven-resource-plugin 拆分为单独的执行,每个执行都有其编码:

  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
      <nonFilteredFileExtensions>
        <nonFilteredFileExtension>ico</nonFilteredFileExtension>
        <nonFilteredFileExtension>jar</nonFilteredFileExtension>
      </nonFilteredFileExtensions>
    </configuration>
    <executions>
      <execution>
        <id>filter-properties-files</id>
        <phase>generate-resources</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <!-- java properties files are encoded in ISO-8859-1 so when 
            filtering those files we stick with that encoding. -->
          <encoding>ISO-8859-1</encoding>
          <outputDirectory>${basedir}/after</outputDirectory>
          <resources>
            <resource>
              <filtering>true</filtering>
              <directory>${basedir}/before</directory>
              <includes>
                <include>**/*.properties</include>
              </includes>
            </resource>
          </resources>
        </configuration>
      </execution>
      <execution>
        <id>filter-non-properties-files</id>
        <phase>generate-resources</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <encoding>${project.build.sourceEncoding}</encoding>
          <outputDirectory>${basedir}/after</outputDirectory>
          <resources>
            <resource>
              <filtering>true</filtering>
              <directory>${basedir}/before</directory>
              <includes>
                <include>**/*.product</include>
                <include>**/*.inf</include>
              </includes>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>

这似乎有点过分了,我有一种感觉,我要么没有正确使用该插件,要么应该以其他方式处理这个问题。也许坚持直接在属性文件中编码特殊字符:

aboutText=Version ${project.version} \u00a9 2012 blabla

?


这个问题本身就是一个非常宝贵的答案,因为显然作者提供的复杂过程是为各种过滤文件类型配置不同编码的唯一方法。然而,给出的示例特定于作者的非标准用例,并掩盖了一些重要的细节,如果没有这些细节,该示例的实际使用就会充满陷阱:

  • 不是很明显,但是在作者的例子中默认资源复制目标resources仍然启用并在两个既定目标之外运行!
  • 您会注意到作者使用了生命周期阶段generate-resources而不是默认的process-resources。这是绕过上面第一点的技巧;通过使两个copy-resources目标发生在较早的生命周期阶段,根据给定的规则复制资源,然后当default-resources目标是原始资源复制保持不变,显然是因为它overwrite设置默认值false。但最好是完全禁用 https://stackoverflow.com/a/7800764/421049 the default-resources执行。
  • 作者提供了一个outputDirectory宣言。人们很自然地认为作者提供这个只是因为需要自定义输出目录;毕竟,resourcesgoal 为此设置提供默认值。但奇怪的是,对于copy-resources目标这个设置其实是需要的!有一个标准的 Maven 变量${project.build.outputDirectory}但是,它可以用作值。

基于作者在问题中自己的示例,这里是一种使用 ISO-8859-1 过滤属性文件的剪切和粘贴方法,复制其他文件而不进行过滤,并防止发生默认资源复制;全部使用标准源目录和目标目录:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>2.7</version>
  <executions>
    <execution>
      <!-- Turn off default resource copying. -->
      <id>default-resources</id>
      <phase />
    </execution>
    <execution>
      <!-- Filter resources in properties files. -->
      <id>filter-properties-files</id>
      <phase>process-resources</phase>
      <goals>
        <goal>copy-resources</goal>
      </goals>
      <configuration>
        <encoding>ISO-8859-1</encoding>
        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
              <include>**/*.properties</include>
            </includes>
          </resource>
        </resources>
      </configuration>
    </execution>
    <execution>
      <!-- Do not do property substitution in files that are not properties files, such as binary files. -->
      <id>copy-other-resources</id>
      <phase>process-resources</phase>
      <goals>
        <goal>copy-resources</goal>
      </goals>
      <configuration>
        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
            <excludes>
              <exclude>**/*.properties</exclude>
            </excludes>
          </resource>
        </resources>
      </configuration>
    </execution>
  </executions>
</plugin>

Update:经过更多研究,我相信,可以简单地修改默认执行以忽略属性文件,并添加对属性文件的过滤作为附加执行,而不是禁用默认执行。此外,如果resources使用目标而不是copy-resources,不需要指示输出目录或阶段,因为resources:resources自动绑定到process-resources相位和输出到${project.build.outputDirectory}。请注意,我已经更新到该插件的 3.1.0 版本,因此其中一些选项可能在我上面使用的版本中不可用。我还没有测试过这个新的、更短的配置。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <!-- Ignore properties files by default. -->
      <id>default-resources</id>
      <configuration>
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <excludes>
              <exclude>**/*.properties</exclude>
            </excludes>
          </resource>
        </resources>
      </configuration>
    </execution>
    <execution>
      <!-- Filter resources in properties files using ISO-8859-1. -->
      <id>filter-properties-files</id>
      <goals>
        <goal>resources</goal>
      </goals>
      <configuration>
        <encoding>ISO-8859-1</encoding>
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
              <include>**/*.properties</include>
            </includes>
          </resource>
        </resources>
      </configuration>
    </execution>
  </executions>
</plugin>

也许有人可以测试这个新配置,并让我知道它是否与我上面给出的原始配置相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在maven中配置不同文件类型的编码? 的相关文章

随机推荐

  • 如何为任何给定坐标找到正确的邻居?

    更新 这个问题正在寻求有关如何获取任何给定坐标的一组邻居的指导 我创建了一个包含坐标的二维数组 int coordinates 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 1 正如您所知 这些是坐标 0 0 的邻居 现在我正
  • Java SecureRandom 声明应该是特定于静态类的,也可以是特定于实例的

    我正在尝试使用SecureRandom在我的java项目中生成随机数 但我对如何保存我的对象有点困惑SecureRandom 它应该是一个static班级成员 我不打算从外面打电话 以下是我当前的实现 Class MyClass priva
  • 在 C# 中记录击键时输入特殊字符时显示双字符

    我有一个应用程序可以记录用户按下的任何内容 但是当我按下特殊字符时 例如 with a 要得到 I get a 当我想要得到同样的东西时 然后我得到 a 因此所有特殊字符都会输入两次 然后再输入常规字符 我一直在寻找 却找不到任何真正的东西
  • 包裹元素然后在其中附加另一个元素

    看这段代码 div class preview img src link alt class overlay div 我需要做的是将内部 div 调用 overlay 然后附加另一个名为 overlay2 的 div 如下所示 div cl
  • Rails:将可选参数组合到查询中

    我有一个包含需要过滤的巨大分页记录列表的视图 用户可以通过几种不同的方式按记录进行过滤 例如 已保存 记录 读取 记录和 标记已删除 记录 我希望他们能够combine这些过滤器以任何可能的方式 我目前的 有缺陷的 不起作用的方法 除非所有
  • 避免使用实体类内的方法定义进行查询时出现查询客户端评估错误

    In a NET核心2 1项目中 我使用 EF Core 和命令模式 使用MediatRSQL Server 数据库上的库 我通过使用以下设置来设置项目以避免客户端查询评估 var phaseOptions new DbContextOpt
  • iPhone 视频缓冲区

    我正在尝试在不越狱 iPhone 的情况下构建一个录像机 我有开发人员许可证 我开始使用PhotoLibrary私有框架 但我只能达到2ftp 太慢 Cycoder 应用程序的 fps 为 15 我认为它使用了不同的方法 我尝试从 Came
  • 尝试在节点集群后面扩展时 phantomjs-node 崩溃

    相关 GitHub 问题 https github com sgentle phantomjs node issues 280 https github com sgentle phantomjs node issues 280 我有一个简
  • `tf.multiply` 和 `*` 有什么区别?

    After import tensorflow kera backend as K 有什么区别tf multiply and 同样 有什么区别K pow x 1 and 1 x 我根据其他一些代码编写了以下自定义指标函数的代码 def di
  • SQL Server 2005:SQL Server 身份验证有多安全?

    如果您使用 SQL Server 身份验证 2005 登录详细信息是否以明文形式通过网络发送 如您所愿 确保安全 您可以相当轻松地配置 SSL 如果您没有受信任的证书 如果您强制加密 SQL Server 可以创建 颁发它自己的自签名证书供
  • 如果我想将单个可变对象传递给函数的多个参数,我该怎么办?

    我用 Rust 编写了一个程序 使用步进电机播放音乐 现在我想添加一些假对象 以便我可以进行自动化测试 但是 我不知道有什么好方法来定义这些假对象 以便我的程序可以实际使用它们 You can 有效的部分 该程序的主循环使用两个特征对象 一
  • 将整数对象的 ArrayList 转换为 int 数组? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将包含 Integers 的 ArrayList 转换为原始 int 数组 https stackoverflow com questions 718554 how to convert an a
  • 当手机处于静音模式时,在后台应用程序上播放声音

    我已经构建了一个计时器应用程序 我遇到的一个问题是当它处于后台时 如果用户关闭音量 我无法敲响计时器 关闭音量或声音也会使通知静音 这是我在后台敲响计时器的方法 我刚买了一块瓷砖 发现了它即使在静音状态下也可以让您的手机响铃 https s
  • 使用 JavaScript 关闭移动浏览器选项卡

    我需要一个本机应用程序来启动带有某些 URL 的浏览器 将用户带到移动网站 在移动网站内部 必须有一个按钮可以关闭浏览器 或向本机应用程序发送任何信号 以便用户返回到本机应用程序 目前我正在尝试关闭窗口 但我认为这不会在所有移动设备上起作用
  • 类型错误:validate_on_submit() 缺少 1 个必需的位置参数:'self'

    我正在使用Flask 网络开发 http shop oreilly com product 0636920031116 do教程和我已经遇到并且正在遇到几个错误 我的简单网络应用程序正在利用 FlaskForm 并尝试验证信息 但遇到了一些
  • 通过 PHP 将 MySQL 转换为 XML

    我的服务器上有一个 MySQL 数据库 我希望通过 PHP 以 XML 形式返回某个表 我见过各种将 XML 传输到 MySQL 的方法 但并不是一种容易遵循的相反方法 我应该怎样做呢 只需提取数据并手动将其形成 XML 文档 使用 DOM
  • 什么是http请求期间的连接超时

    我找到了关于 连接超时 的两种解释 当客户端在 timeout 秒内未向服务器发送任何字节时 服务器将关闭套接字连接 它似乎与 HTTP 标头有一些关系 Connection keep alive 如果在此期间未建立套接字连接 则客户端将在
  • 按比例填充 UIStackView

    我正在使用 Storyboard 创建一个由 UITableView 和底部的 UIView 组成的布局 我正在使用 UIStackView 并垂直播放它们 我希望 UITableView 占据高度的 80 UIView 页脚 占据 20
  • Haskell - 需要为类型类定义 Vector2 实例

    newtype Vector2 a Vector2 a a deriving Show Eq class VectorSpace v where vZero Num a gt v a vSum Num a gt v a gt v a gt
  • 在maven中配置不同文件类型的编码?

    我用maven 资源插件 http maven apache org plugins maven resources plugin faq html过滤我的 Maven 项目中的一些资源 在我的父项目中 我有