java - Как загрузить сторонние пакеты в Maven проект
Только сегодня установил Maven (полистал официальную документацию и немного погуглил, разумеется). Решил использовать библиотеку Jsoup в своем проекте. Создаю проект командой
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Добавляю зависимость в pom.xml (с сайта Jsoup):
<dependency>
<!-- jsoup HTML parser library @ https://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Редактирую файл src/main/java/com/mycompany/app/App.java
:
package com.mycompany.app;
import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class App
{
public static void main( String[] args )
{
String HTMLSTring = ""
+ ""
+ ""
+ "JSoup Example"
+ ""
+ ""
+ ""
+ "HelloWorld"
+ ""
+ "";
Document html = Jsoup.parse(HTMLSTring);
String title = html.title();
String h1 = html.body().getElementsByTag("h1").text();
System.out.println("Input HTML String to JSoup :" + HTMLSTring);
System.out.println("After parsing, Title : " + title);
System.out.println("Afte parsing, Heading : " + h1);
// JSoup Example 2 - Reading HTML page from URL
Document doc;
try {
doc = Jsoup.connect("http://google.com/").get();
title = doc.title();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Jsoup Can read HTML page from URL, title : " + title);
// JSoup Example 3 - Parsing an HTML file in Java
//Document htmlFile = Jsoup.parse("login.html", "ISO-8859-1"); // wrong
Document htmlFile = null;
try {
htmlFile = Jsoup.parse(new File("login.html"), "ISO-8859-1");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // right
title = htmlFile.title();
Element div = htmlFile.getElementById("login");
String cssClass = div.className(); // getting class form HTML element
System.out.println("Jsoup can also parse HTML file directly");
System.out.println("title : " + title);
System.out.println("class of div tag : " + cssClass);
}
}
Собираю проект командой
mvn package
Запускаю скомпилированный и упакованный JAR командой:
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
Возбуждается исключение java.lang.NoClassDefFoundError
:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jsoup/Jsoup
at com.mycompany.app.App.main(App.java:25)
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
Как загрузить Jsoup пакет (в центральном репозитории Maven он найден) и импортировать его классы ?
- 37
- 1
- 5 янв 2018 2018-01-05 12:12:56
- Антон
1 ответ
Запуск валится по причине того, что ты не указал библиотеку Jsoup
в classpathе (параметр cp
). В этом случае тебе также придётся добавлять зависимости Jsoup
в classpath. Но, к счастью, Jsoup
ни от чего не зависит. Поэтому твой запуск превратится примерно в следующее
java -cp "target/my-app-1.0-SNAPSHOT.jar;${путь_до_jsoup}/jsoup.jar" com.mycompany.app.App
Если же ты хочешь упаковать всё в один jarник, чтобы запускать так, как ты указал в вопросе, то можно воспользоваться плагином maven-assembly-plugin
примерно так:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.mycompany.app.App</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Более подробно можно прочитать про это в оригинале ответа
Однако лучше использовать первый вариант, т.к. при сваливании по принципу всё в один
может возникнуть конфликт ресурсов.
- 5 янв 2018 2018-01-05 12:35:47
- Темка тоже
java -cp "target/my-app-1.0-SNAPSHOT.jar;/home/anton/.m2/repository/org/jsoup/jsoup/1.11.3/jsoup-1.11.3.jar;" com.mycompany.app.App
и проверь, чтобы запуск был из корня проекта. — Темка тоже 5 янв 20182018-01-05 16:59:20.000000maven
выкачивает их с удаленного репозитория в локальный при сборке проекта.Jsoup
в удаленном репозитории лежит в central.maven.org/maven2/org/jsoup/jsoup/1.11.3. Локальный репозиторий дляwindows
обычно лежит в%USERPROFILE%.m2repository
, соответственноJSoup
в ней будет в%USERPROFILE%.m2repositoryorgjsoupjsoup1.11.3
— Темка тоже 5 янв 20182018-01-05 16:24:20.000000