Maven 自定义旅行车无法验证下载故障排除的完整性
Maven custom wagon Could not validate integrity of download Troubleshooting
我已经实现了与基于云的存储交互的自定义 Maven wagon。
文件已成功上传到云存储,校验和正确。
md5 of maven-metadata.xml 匹配maven-metadata.xml.md5
的内容
jar 和 pom 文件也是如此
- jar 的 md5 匹配 *.jar.md5 的内容
- md5 of maven-metadata.xml匹配maven-metadata.xml.md5
的内容
- pom的md5匹配*.pom.md5的内容
当我通过 http 而不是使用自定义 wagon 检索文件时,它们的下载没有任何校验和验证异常。
但是,当我使用自定义 wagon 检索文件时,我收到了完整的下载警告。
[WARNING] Could not validate integrity of download from gs://mavenbucket/snapshot/com/gkatzioura/storage/CloudStorageTest/1.0-SNAPSHOT/maven-metadata.xml
org.eclipse.aether.transfer.ChecksumFailureException: Checksum validation failed, expected 7e0c3c33db781362483c0baed3ba175352945028 but is da39a3ee5e6b4b0d3255bfef95601890afd80709
at org.eclipse.aether.connector.basic.ChecksumValidator.validateExternalChecksums (ChecksumValidator.java:174)
at org.eclipse.aether.connector.basic.ChecksumValidator.validate (ChecksumValidator.java:103)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$GetTaskRunner.runTask (BasicRepositoryConnector.java:456)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run (BasicRepositoryConnector.java:360)
at org.eclipse.aether.util.concurrency.RunnableErrorForwarder.run (RunnableErrorForwarder.java:75)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute (BasicRepositoryConnector.java:583)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector.get (BasicRepositoryConnector.java:232)
通过自定义 wagon 成功下载工件后,我检查从云存储下载的文件的 md5,它们与云存储中的 *.md5 文件匹配。
解决这个问题的过程是怎样的,我该如何调试它?
发生这种情况的原因与没有调用 TransferListeners 的 transferProgress 方法有关。
为此,您必须提供一种机制,以便在复制 OutputStream(下载时)和 InputStream(上传时)时也将调用 transferProgress 方法。
例如
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.maven.wagon.events.TransferEvent;
import org.apache.maven.wagon.events.TransferListener;
public class WrappedOutputStreamExample extends FileOutputStream {
private TransferListener transferListener;
public WrappedOutputStreamExample(File file,TransferListener transferListener) throws FileNotFoundException {
super(file);
this.transferListener = transferListener;
}
@Override
public void write(int b) throws IOException {
super.write(b);
TransferEvent transferEvent = null; //provide corrent transfer event
this.transferListener.transferProgress(transferEvent,new byte[]{(byte) b}, 1);
}
@Override
public void write(byte b[]) throws IOException {
super.write(b);
TransferEvent transferEvent = null; //provide corrent transfer event
this.transferListener.transferProgress(transferEvent,b, b.length);
}
@Override
public void write(byte b[], int off, int len) throws IOException {
TransferEvent transferEvent = null; //provide corrent transfer event
super.write(b, off, len);
if (off == 0) {
this.transferListener.transferProgress(transferEvent,b, len);
} else {
byte[] bytes = new byte[len];
System.arraycopy(b, off, bytes, 0, len);
this.transferListener.transferProgress(transferEvent,bytes, len);
}
}
}
我已经实现了与基于云的存储交互的自定义 Maven wagon。 文件已成功上传到云存储,校验和正确。
md5 of maven-metadata.xml 匹配maven-metadata.xml.md5
的内容jar 和 pom 文件也是如此
- jar 的 md5 匹配 *.jar.md5 的内容
- md5 of maven-metadata.xml匹配maven-metadata.xml.md5 的内容
- pom的md5匹配*.pom.md5的内容
当我通过 http 而不是使用自定义 wagon 检索文件时,它们的下载没有任何校验和验证异常。
但是,当我使用自定义 wagon 检索文件时,我收到了完整的下载警告。
[WARNING] Could not validate integrity of download from gs://mavenbucket/snapshot/com/gkatzioura/storage/CloudStorageTest/1.0-SNAPSHOT/maven-metadata.xml
org.eclipse.aether.transfer.ChecksumFailureException: Checksum validation failed, expected 7e0c3c33db781362483c0baed3ba175352945028 but is da39a3ee5e6b4b0d3255bfef95601890afd80709
at org.eclipse.aether.connector.basic.ChecksumValidator.validateExternalChecksums (ChecksumValidator.java:174)
at org.eclipse.aether.connector.basic.ChecksumValidator.validate (ChecksumValidator.java:103)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$GetTaskRunner.runTask (BasicRepositoryConnector.java:456)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run (BasicRepositoryConnector.java:360)
at org.eclipse.aether.util.concurrency.RunnableErrorForwarder.run (RunnableErrorForwarder.java:75)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute (BasicRepositoryConnector.java:583)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector.get (BasicRepositoryConnector.java:232)
通过自定义 wagon 成功下载工件后,我检查从云存储下载的文件的 md5,它们与云存储中的 *.md5 文件匹配。
解决这个问题的过程是怎样的,我该如何调试它?
发生这种情况的原因与没有调用 TransferListeners 的 transferProgress 方法有关。
为此,您必须提供一种机制,以便在复制 OutputStream(下载时)和 InputStream(上传时)时也将调用 transferProgress 方法。
例如
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.maven.wagon.events.TransferEvent;
import org.apache.maven.wagon.events.TransferListener;
public class WrappedOutputStreamExample extends FileOutputStream {
private TransferListener transferListener;
public WrappedOutputStreamExample(File file,TransferListener transferListener) throws FileNotFoundException {
super(file);
this.transferListener = transferListener;
}
@Override
public void write(int b) throws IOException {
super.write(b);
TransferEvent transferEvent = null; //provide corrent transfer event
this.transferListener.transferProgress(transferEvent,new byte[]{(byte) b}, 1);
}
@Override
public void write(byte b[]) throws IOException {
super.write(b);
TransferEvent transferEvent = null; //provide corrent transfer event
this.transferListener.transferProgress(transferEvent,b, b.length);
}
@Override
public void write(byte b[], int off, int len) throws IOException {
TransferEvent transferEvent = null; //provide corrent transfer event
super.write(b, off, len);
if (off == 0) {
this.transferListener.transferProgress(transferEvent,b, len);
} else {
byte[] bytes = new byte[len];
System.arraycopy(b, off, bytes, 0, len);
this.transferListener.transferProgress(transferEvent,bytes, len);
}
}
}