Я только начал изучать Java, но проблемы возникают почти на каждом этапе ... Хотелось бы, чтобы это супер простое руководство по началу работы работал (с официальной страницы Maven) :)
Я сделал каждый шаг, как в этом руководстве, и построил проект, но не могу его запустить.
Итак, после mvn package у меня есть BUILD SUCCESSFUL, но когда я пытаюсь запустить файл jar с помощью этой команды java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App, возникает ошибка:
Error: Could not find or load main class com.mycompany.app.App
Caused by: java.lang.ClassNotFoundException: com.mycompany.app.App
Как это исправить?
версия java "11.0.1" 2018-10-16 LTS
Apache Maven 3.6.0
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Структура проекта создается автоматически этой командой, как показано в документации.
my-app
|-src
| |-main
| |-java
| |-com
| |-mycompany
| |-app
| |-App.java
|-pom.xml
|-target
И код App.java:
package com.mycompany.app;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}
И файл pom.xml:
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>maven-test</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>maven-test</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
</project>
Также мне пришлось добавить эти строки, чтобы заставить работать команду mvn package:
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
Я предлагаю вам написать свой код и скомпилировать его с помощью команды javac. позже, когда вы улучшите свой образ мышления и знания, вы начнете использовать фреймворки, библиотеки, такие как maven и т. д.
@Stultuske, спасибо, но это не решает проблему. Кроме того, я пытаюсь повторить очень простой пример из официальных документов maven.
@ mr.boris нет, однако в долгосрочной перспективе это могло бы избежать для вас подобных проблем. это как если бы человек, который только что научился ходить после того, как был парализован всю свою жизнь, сказал: «Я только что пытался пробежать 15 миль, и у меня болит нога». Конечно, вы можете массировать ногу, но если вы не наберетесь и не начнете с самого начала, эта нога будет болеть и в следующий раз.
@Stultuske, спасибо за наставничество, но в целом у меня есть опыт программирования. Итак, если возникает какая-то незначительная ошибка, должно быть какое-то простое решение для нее. В целом эта проблема не касается многопоточности или параллелизма. На мой взгляд, решение таких проблем должно быть в первых строках поиска Google, но это не так (особенно если это связано с официальными документами). Итак, это первый тревожный сигнал для меня, чтобы я продолжал работать с Java.
Вообще говоря, я согласен с тем, что лучше начать с простого, и отказ от чего-то вроде Maven, вероятно, даст вам лучший начальный опыт работы с Java, однако, как вы определили, это все еще простой пример симпатичный, поэтому я не думаю, что это ужасный способ начать. Мой обычный первый шаг для устранения подобных проблем - это проверить сгенерированный файл JAR, сначала подтвердить, что он существует в вашем каталоге /target и имеет ожидаемое имя (вероятно), а затем, поскольку это всего лишь zip-файл, вы можете распаковать его. его и убедитесь, что содержимое соответствует структуре вашего проекта.
Как бы то ни было, выполнение описанных выше шагов (без ссылки на руководство) отлично работает для меня, без настройки упомянутых вами элементов properties. Я подозреваю, что проблема в другом ... Может быть, в версиях Maven / Java?
вы запускаете команду java ... из основного каталога проекта? Попробуйте оттуда jar -tf target/my-app-1.0-SNAPSHOT.jar, чтобы посмотреть, что внутри банки, чтобы убедиться, что класс App находится там с правильным путем.
@Chirlo, спасибо, эта команда у меня не работает: java.nio.file.NoSuchFileException: target/my-app-1.0-SNAPSHOT.jar
@DaveyDaveDave, спасибо за ответ. Я использую версию Java 11.0.1 2018-10-16 LTS и 3.6.0 для Apache Maven. Я не знаю, почему то же самое работает для вас, но не работает для меня.




Вы можете повторить попытку с этими 4 коммендами:
> mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
> cd my-app
> mvn package
> java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
Спасибо за тестирование этого образца. У меня ошибка на шаге mvn package .. BUILD FAILURETarget option 1.5 is no longer supported. Use 1.6 or later.. По крайней мере, на этом этапе мне нужно добавить properties в файл pom.xml.
Основываясь на ваших выводах команды jar (NoSuchFileException из комментариев), кажется, что вы запускали команду java из некоторого каталога, отличного от каталога проекта maven. Ответ @Sgrillon работает, потому что он меняет каталог на каталог my-app, запускает команду mvn package, а затем команду java из того же каталога. Затем есть target/my-app-1.0-SNAPSHOT.jar (сгенерированный maven) и его можно найти с помощью команды java, чтобы включить его в свой путь к классам (-cp)
Это не проблема java или maven, а проблема с путем к файлу.
РЕДАКТИРОВАТЬ: Я только что понял на вашем pom.xml, что ваш артефакт назван maven-test
<artifactId>maven-test</artifactId>
В этом случае банка была бы target/maven-test-1.0-SNAPSHOT.jar вместо my-app..., и поэтому ни java, ни jar не смогли ее найти.
Спасибо, теперь все работает после удаления текущего проекта и повторения всех шагов снова, несмотря на тот факт, что мне пришлось немного изменить properties в файле pom.xml для правильного управления версиями компилятора Maven. На самом деле, я пытался запустить файл .jar из того же каталога (из корня проекта), поэтому я понятия не имею, почему произошла эта ошибка.
@ Mr.boris, см. Мою правку ответа, вы вручную изменили artifactId в pom.xml ??
@Chirlo, что изменится с artifactId с maven-test. У меня такая же проблема
@ Хана, не знаю, о чем ты спрашиваешь. В этом вопросе OP, вероятно, изменил параметр -DartifactId=my-app на -DartifactId=maven-test при создании проекта, но изменил его при вызове java -cp target/my-app-1.0-SNAPSHOT.jar ....
Если вы только начинаете изучать Java, начните с самостоятельного изучения Java. добавить maven позже