HttpClient - загрузка файла JAR с использованием Tomcat Webdav приводит к «неверному или поврежденному файлу JAR» - PullRequest
0 голосов
/ 24 мая 2018

Я не могу загрузить файл JAR, используя Webdav и Apache HTTPClient, не приводя к «неверному или поврежденному jarfile» при попытке его запустить.

Вот мои настройки:

  • Сервер Webdav, использующий tomcat 8.5 во внешнем каталоге (определен в $ CATALINA_HOME / conf / Catalina / localhost / webdav.xml)
  • Клиент Apache HTTP (org.apache.httpcomponents: httpclient: 4.5.5)
  • Пользовательский подключаемый модуль Maven с использованием HTTP-клиента для загрузки файла

Файл загружается с использованием настраиваемого подключаемого модуля Maven (который использует HTTP-клиент внутри) после создания JAR.

Если я попытаюсь использовать HTTP-клиент для загрузки файла на удаленный сервер, это приведет к повреждению.Но я могу запустить Jar без проблем, если я отправляю тот же файл с помощью команды curl

curl -u <user>:<pass> -T <myjar>.jar http://<remotehost>/<myjar>.jar

Вот пример кода с использованием клиента HTTP:

class FileSender {
    public static void main(String[] args) {
        // [...]
        RequestConfig.Builder cfg = RequestConfig.copy(RequestConfig.DEFAULT);
        cfg = cfg.setConnectTimeout(timeout)
                .setConnectionRequestTimeout(timeout)
                .setSocketTimeout(timeout);

        CredentialsProvider credentialsProvider = authentication.credentials();
        HttpClientBuilder builder = HttpClientBuilder.create()
                .setDefaultRequestConfig(cfg.build())
                .setDefaultCredentialsProvider(credentialsProvider);
        try(CloseableHttpClient client = builder.build()) {
            HttpPut httpPut = new HttpPut("http://<remote>/<myJar>.jar");
            httpPut.setEntity(MultipartEntityBuilder.create()
                    .addBinaryBody("file", new File("path/to/<myJar>.jar"))
                    .build());
            try (CloseableHttpResponse response = client.execute(httpPut)) {
                // Check response HTTP status
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Есть ли у вас что может вызвать мою проблему?

Редактировать: MD5-хэши кажутся разными, если я использую HTTP Client и CURL, но копии CURL и FTP используют одни и те же хэши.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я решил это, изменив

MultipartEntityBuilder.create()
           .addBinaryBody("file", new File("path/to/<myJar>.jar"))
           .build()

на

new InputStreamEntity(new FileInputStream(new File("path/to/<myJar>.jar)))
0 голосов
/ 24 мая 2018

Это способ, которым вы можете загрузить любой файл с помощью HttpClient:

CloseableHttpClient httpClient = HttpClientBuilder.create().build();

HttpEntity requestEntity = MultipartEntityBuilder.create().addBinaryBody("file", new File("myfile")).build();

HttpPost post = new HttpPost("http://...");
post.setEntity(requestEntity);

try (CloseableHttpResponse response = httpClient.execute(post)) {
    System.out.print(response.getStatusLine());
}

Обычно метод POST используется для загрузки формы или содержимого файла.

...