java - maven打包导致二进制文件大小被改变
伊谢尔伦
伊谢尔伦 2017-04-18 10:47:12
0
1
998

使用class.getClassLoader().getResourceAsStream()这种方法获取classpath下的文件流,读取出来的文件比写main方法读出来的文件大小更大。

问题已经解决。

本地main方法测试

使用tomcat做为容器运行同样代码时

相关代码:

 synchronized (PhoneNumberGeo.class) {
        if (dataByteArray == null) {
          ByteArrayOutputStream byteData = new ByteArrayOutputStream();
          byte[] buffer = new byte[1024];

          int readBytesLength;
          try {
            InputStream inputStream = PhoneNumberGeo.class.getClassLoader()
                    .getResourceAsStream("phone.dat");
              while ((readBytesLength = inputStream.read(buffer)) != -1) {
              byteData.write(buffer, 0, readBytesLength);
            }
            inputStream.close();
          } catch (Exception e) {
            System.err.println("Can't find phone.dat in classpath phone.dat");
            e.printStackTrace();
            throw new RuntimeException(e);
          }

          dataByteArray = byteData.toByteArray();
        }
      }
    }

    byteBuffer = ByteBuffer.wrap(dataByteArray);
    byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
    int dataVersion = byteBuffer.getInt();
    indexAreaOffset = byteBuffer.getInt();

完整代码:
开源代码github

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(1)
黄舟

問題は解決しました〜!
概要: この問題は、バイナリ ファイルをクラスパスに配置し、maven-resources-plugin プラグインを使用してリソース ファイルをコピーすることが原因で発生します。

詳細には、maven-resources-plugin プラグインのオプションがあるはずです

リーリー

これがオンになっている場合、クラスパス内にコピーされるファイルはデフォルトで置き換えられ、プロパティにマッピングされます
その後、jdbc.properties などの XML 設定で使用できるようになります。ただし、この操作は、png、gif、pdf などのバイナリ ファイルには適していません。
これらのファイル形式を除外する必要があります。

リーリー

思考プロセス:
プロジェクトが参照しているjarパッケージのせいだと思い、かなり寄り道をし始めましたが、長時間探しても原因が見つかりませんでした。最終的に、各ファイルの md5 を確認し、ターゲット ディレクトリ内のファイルとリソース ディレクトリ内のファイルが不一致であることを確認し、最終的に問題を発見しました。

参考:
Mavenバイナリフィルタリング
クラスパス下のファイルを取得するその他のメソッド

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート