возня с apache httpclient в java

Jan 24, 2021 13:02


Решил заняться изучением java. Надо мне сделать http соединение в проекте.



Погуглил, решил, что мне подходит библиотека apache htttp client https://hc.apache.org/downloads.cgi - примеры есть в сети, например, вот этот мне понравился: https://mkyong.com/java/apache-httpclient-examples/. Пользуюсь netbeans IDE 12.0 и maven в качестве менеджера зависимостей - мне так исторически удобнее - ближайший человек который боле-менее знает java пользуется maven и netbeans, а не gradle и ide от jetbrains (это выбрал бы я, так как должно быть поудобней). Так вот с http клиентом от apache в netbeans какая-то засада:
Пишу import:  "import org.apache.http.HttpEntity;" - подсвечивается красным, окей, выбираю в netbeans левой кнопкой мыши на значке с восклицательным знаком вариант поискать в репозитории мавен. И тут опаньки - в репозитории, во первых, какое-то старьё (даже мажорная часть версии не совпадает - 4я вместо 5й как на сайте), а во вторых netbeans после поиска httpclient даёт «plain list», в котором слишком много вариантов. Ну ладно, нашёл там httpclient и вроде бы от apache. Но, внезапно, выясняется, что библиотека разбита на несколько jar'ников и когда продолжаешь копипастить из примера часть импортов по прежнему красная - надо добавлять httpcore и возможно что-то ещё.. а в поиске в maven выдаёт опять много вариантов и не видно сразу версию, а значит непонятно какой вариант выбрать. Ну что за отстой! Ладно.. добавляю из поиска maven зависимость, но она почему-то встаёт не так, как остальные, а в виде особенной зависимости - non-class или что-то типа (сейчас не получается воспроизвести)

В telegram канале LearnJava предположили, что от версии к версии у apache много чего меняется и уточнили, что вообще-то httpclient уже есть в самой Java. Но мне не понравился пример из интернет с использованием встроенной в Java возможности устанавливать http соединение - уж больно многословно - вариант с библиотекой от apache выглядит гораздо компактней. Ладно, думаю, фиг с вами - поставлю библиотеку в ручном режиме с сайта apache. Делаю это так - в pom.xml проекта прописываю по аналогии с отальными зависимостями отсутствующую в проекте зависимость с apache hc http client. После чего netbeans начинает показывать эту зависимость в дереве зависимостей проекта как сломанную:

Error resolving project artifact: Could not find artifact org.apache.httpcomponents:httpclient5:pom:5.0.3 in central (https://repo.maven.apache.org/maven2) for project org.apache.httpcomponents:httpclient5:jar:5.0.3

и можно ткнуться в неё и выбрать «install manually». Добавляю зависимость вручную - выбираю соответствующий jar в каталоге куда разархивировал скачанное и:

Installing /home/olli/Downloads/Java-related/apache-http-libs/httpcomponents-client-5.0.3/lib/httpclient5-5.0.3.jar to /home/olli/.m2/repository/org/apache/httpcomponents/httpclient5/5.0.3/httpclient5-5.0.3.jar

------------------------------------------------------------------------

BUILD SUCCESS

Код проекта:

----------------cut-----------------

package com.grey.olli.learning.apachehttpclient;

import java.io.IOException;

import java.util.Arrays;

// manually added imports:

import org.apache.hc.client5.http.classic.methods.HttpGet;

import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;

import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;

import org.apache.hc.client5.http.impl.classic.HttpClients;

import org.apache.hc.core5.http.HttpEntity;

import org.apache.hc.core5.http.HttpHeaders;

import org.apache.hc.core5.http.ParseException;

import org.apache.hc.core5.http.io.entity.EntityUtils;

/**

*

* @author olli

*/

public class HttpConnect {

public static void main(String[] args) throws ParseException {

String host = "disk.yandex.ru";

HttpGet request;

request = new HttpGet("https://" + host);

request.addHeader(HttpHeaders.USER_AGENT, "yandexdiskcloudapp");

try (CloseableHttpClient httpClient = HttpClients.createDefault();

CloseableHttpResponse response = httpClient.execute(request)) {

// Get HttpResponse Status

System.out.println(response.getVersion());      // old was .getProtocolVersion()); // HTTP/1.1

System.out.println(response.getCode());         // old was .getStatusLine().getStatusCode());   // 200

System.out.println(response.getReasonPhrase()); // old was .getStatusLine().getReasonPhrase()); // OK

System.out.println("All headers:\n");           // HTTP/1.1 200 OK

System.out.println(Arrays.toString(response.getHeaders()));

System.out.println("entity:\n");

HttpEntity entity = response.getEntity();

if (entity != null) {

// return it as a String

String result;

result = EntityUtils.toString(entity);

System.out.println(result);

}

} catch (IOException e) {

System.out.println(e.getMessage());

}

}

}

----------------cut-----------------

Сборка (clean and build) проходит нормально, за исключением жалобы на отстутствие pom для библиотеки с указанием, что нет информации о зависимостях:

----------------cut лога сборки-----------------

cd /home/olli/Documents/JavaQuestions/apachehttpclient; JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-0.fc31.x86_64 /home/olli/netbeans/java/maven/bin/mvn clean install

Scanning for projects...

--------------< com.grey.olli.learning:apachehttpclient >---------------

Building apachehttpclient 1.0-SNAPSHOT

--------------------------------[ jar ]---------------------------------

The POM for org.apache.httpcomponents:httpclient5:jar:5.0.3 is missing, no dependency information available

The POM for org.apache.httpcomponents:httpcore5:jar:5.0.2 is missing, no dependency information available

--- maven-clean-plugin:2.5:clean (default-clean) @ apachehttpclient ---

Deleting /home/olli/Documents/JavaQuestions/apachehttpclient/target

--- maven-resources-plugin:2.6:resources (default-resources) @ apachehttpclient ---

Using 'UTF-8' encoding to copy filtered resources.

skip non existing resourceDirectory /home/olli/Documents/JavaQuestions/apachehttpclient/src/main/resources

--- maven-compiler-plugin:3.1:compile (default-compile) @ apachehttpclient ---

Changes detected - recompiling the module!

Compiling 1 source file to /home/olli/Documents/JavaQuestions/apachehttpclient/target/classes

--- maven-resources-plugin:2.6:testResources (default-testResources) @ apachehttpclient ---

Using 'UTF-8' encoding to copy filtered resources.

skip non existing resourceDirectory /home/olli/Documents/JavaQuestions/apachehttpclient/src/test/resources

--- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ apachehttpclient ---

Nothing to compile - all classes are up to date

--- maven-surefire-plugin:2.12.4:test (default-test) @ apachehttpclient ---

No tests to run.

--- maven-jar-plugin:2.4:jar (default-jar) @ apachehttpclient ---

Building jar: /home/olli/Documents/JavaQuestions/apachehttpclient/target/apachehttpclient-1.0-SNAPSHOT.jar

--- maven-install-plugin:2.4:install (default-install) @ apachehttpclient ---

Installing /home/olli/Documents/JavaQuestions/apachehttpclient/target/apachehttpclient-1.0-SNAPSHOT.jar to /home/olli/.m2/repository/com/grey/olli/learning/apachehttpclient/1.0-SNAPSHOT/apachehttpclient-1.0-SNAPSHOT.jar

Installing /home/olli/Documents/JavaQuestions/apachehttpclient/pom.xml to /home/olli/.m2/repository/com/grey/olli/learning/apachehttpclient/1.0-SNAPSHOT/apachehttpclient-1.0-SNAPSHOT.pom

------------------------------------------------------------------------

BUILD SUCCESS

------------------------------------------------------------------------

Total time:  3.215 s

Finished at: 2021-01-24T12:32:30+03:00

------------------------------------------------------------------------

----------------cut-----------------

Вопрос - вот это вот:

The POM for org.apache.httpcomponents:httpclient5:jar:5.0.3 is missing, no dependency information available

The POM for org.apache.httpcomponents:httpcore5:jar:5.0.2 is missing, no dependency information available

Откуда я его должен был взять и куда положить? .pom файлов в комплекте скачанного с сайта apache hc httpclient не было.

А вот далее при попытке запустить получается полный облом:

----------------cut-----------------

cd /home/olli/Documents/JavaQuestions/apachehttpclient; JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-0.fc31.x86_64 /home/olli/netbeans/java/maven/bin/mvn "-Dexec.args=-classpath %classpath com.grey.olli.learning.apachehttpclient.HttpConnect" -Dexec.executable=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-0.fc31.x86_64/bin/java org.codehaus.mojo:exec-maven-plugin:1.5.0:exec

Running NetBeans Compile On Save execution. Phase execution is skipped and output directories of dependency projects (with Compile on Save turned on) will be used instead of their jar artifacts.

Scanning for projects...

--------------< com.grey.olli.learning:apachehttpclient >---------------

Building apachehttpclient 1.0-SNAPSHOT

--------------------------------[ jar ]---------------------------------

The POM for org.apache.httpcomponents:httpclient5:jar:5.0.3 is missing, no dependency information available

The POM for org.apache.httpcomponents:httpcore5:jar:5.0.2 is missing, no dependency information available

--- exec-maven-plugin:1.5.0:exec (default-cli) @ apachehttpclient ---

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

at org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:108)

at org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder.build(PoolingHttpClientConnectionManagerBuilder.java:201)

at org.apache.hc.client5.http.impl.classic.HttpClientBuilder.build(HttpClientBuilder.java:738)

at org.apache.hc.client5.http.impl.classic.HttpClients.createDefault(HttpClients.java:57)

at com.grey.olli.learning.apachehttpclient.HttpConnect.main(HttpConnect.java:35)

Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

at java.net.URLClassLoader.findClass(URLClassLoader.java:382)

at java.lang.ClassLoader.loadClass(ClassLoader.java:418)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)

at java.lang.ClassLoader.loadClass(ClassLoader.java:351)

... 5 more

Command execution failed.

org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)

at org.apache.commons.exec.DefaultExecutor.executeInternal (DefaultExecutor.java:404)

at org.apache.commons.exec.DefaultExecutor.execute (DefaultExecutor.java:166)

at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:764)

at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:711)

at org.codehaus.mojo.exec.ExecMojo.execute (ExecMojo.java:289)

at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)

at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)

at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)

at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)

at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)

at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)

at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)

at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)

at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)

at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)

at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)

at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke (Method.java:498)

at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)

at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)

at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)

at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)

------------------------------------------------------------------------

BUILD FAILURE

------------------------------------------------------------------------

Total time:  1.727 s

Finished at: 2021-01-24T12:46:27+03:00

------------------------------------------------------------------------

Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.5.0:exec (default-cli) on project apachehttpclient: Command execution failed.: Process exited with an error: 1 (Exit value: 1) -> [Help 1]

To see the full stack trace of the errors, re-run Maven with the -e switch.

Re-run Maven using the -X switch to enable full debug logging.

For more information about the errors and possible solutions, please read the following articles:

[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

----------------cut-----------------

pom.xml от проекта таков:

----------------cut-----------------

4.0.0

com.grey.olli.learning

apachehttpclient

1.0-SNAPSHOT

jar

org.apache.httpcomponents

httpclient5

5.0.3

jar

org.apache.httpcomponents

httpcore5

5.0.2

jar

UTF-8

1.8

1.8

----------------cut-----------------

Если я должен прописать dependencies в этот pom, то откуда я их должен взять - есть ли какое-то средство автоматизации процесса? В README к библиотеке написано, что

----------------cut-----------------

HttpClient main module requires Java 7 compatible runtime and

depends on the following external libraries:

* Apache HttpComponents HttpCore

* Apache Logging Log4j2 API

* Apache Commons Codec

Other dependencies are optional.

----------------cut-----------------

Вопрос - если не запускаеся именно из-за отсутствия этих библиотек - где их взять и почему их не дают в комплекте httpclient ? А если не из-за этого, то почему?

java, programming, life

Previous post Next post
Up