Решил заняться изучением 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 ? А если не из-за этого, то почему?