mgoblue0970 Ответов: 2

Проблемы компиляции java из командной строки


Вот структура папок:

C:.
└───src
    ├───main
    │   └───java
    │       └───com
    │           └───myCompany
    │               └───Runner.java
    │
    └───test
        └───java
            └───com
                └───myCompany
                    └───BasicTest.java


Вот это BasicTest.java:

package com.myCompany;

import junit.framework.TestCase;

public class BasicTest extends TestCase {
	
  public BasicTest() {
  }	  
	
  public void testTrue() {
    assertTrue(true);
  }
}


Вот это Runner.java:

package com.myCompany;

public class Runner {

public static void main(String[] args) {

    BasicTest bt = new BasicTest();
    bt.testTrue();

    System.out.print("Finished");
  }
}


Достаточно просто, не так ли? Читайте дальше...

Что я уже пробовал:

Время для компиляции BasicTest.java

C:\workspace\BasicTest>javac -cp c:\junit\latest\junit-4.10.jar c:\workspace\BasicTest\src\test\java\com\myCompany\*.java


Это работает просто отлично...

Когда я пытаюсь скомпилировать Runner.java-я все понимаю:

C:\workspace\BasicTest>javac -cp c:\workspace\BasicTest\src\test\java\com\myCompany c:\workspace\BasicTest\src\main\java\com\myCompany\*.java


c:\workspace\BasicTest\src\main\java\com\myCompany
c:\workspace\BasicTest\src\main\java\com\myCompany\Runner.java:7: error: cannot find symbol
    BasicTest bt = new BasicTest();
    ^
  symbol:   class BasicTest
  location: class Runner
c:\workspace\BasicTest\src\main\java\com\myCompany\Runner.java:7: error: cannot find symbol
    BasicTest bt = new BasicTest();
                       ^
  symbol:   class BasicTest
  location: class Runner
2 errors


Я гуглил до посинения и никак не мог разобраться в этой ошибке. Я понимаю ошибку, она достаточно элементарна, я пытаюсь сказать, что не понимаю, почему я ее получаю-я явно дал компилятору пути.

2 Ответов

Рейтинг:
19

Richard MacCutchan

Я играл с этим и читал Установка пути к классу[^], и удалось построить набор, хотя и не полное дерево каталогов, которое у вас есть. Попробуйте выполнить следующие действия с уменьшенным деревом путей к классам:

javac -cp c:\workspace\BasicTest\src\test\java c:\workspace\BasicTest\src\main\java\com\myCompany\*.java


[редактировать]
Потому что (я думаю) BasicTest находится (подразумевается) в упаковке com.myCompany компилятор и среда выполнения будут искать его в %CLASSPATH%\com\myCompany отсюда и ваши проблемы.
[/редактировать]


mgoblue0970

Упс... Я думаю, что хотел ответить на ваш пост @Richard MacCutchan, но вместо этого я отправил ответ. Пожалуйста, прочтите мой ответ ниже. Спасибо!

Рейтинг:
1

mgoblue0970

@Richard MacCutchan, спасибо за ответ!

Хотя меня действительно смущает пара вещей...

Цитата:
Потому что (я думаю) BasicTest находится (подразумевается) в пакете com.myCompany


Это не подразумевается. Так и есть! Оба исходных файла начинаются с:

package com.myCompany;


Цитата:
Попробуйте выполнить следующие действия с уменьшенным деревом путей к классам:
Скрыть Код Скопировать
и javac -СР c:\workspace\BasicTest\src\test\java c:\workspace\BasicTest\src\main\java\com\myCompany\*.Ява


Это само по себе бросает беспорядок ошибок... это не принимая во внимание банку junit.

Когда я изменю ваше предложение вот так:

javac -cp c:\junit\latest\junit-4.10.jar;c:\workspace\BasicTest\src\test\java c:\workspace\BasicTest\src\main\java\com\myCompany\*.java

Это работает!!! Спасибо.

Но это все еще не решено. Он компилируется-но я не могу бежать:

C:\workspace\BasicTest\src\main\java>java com.myCompany.Runner<br />
Exception in thread "main" java.lang.NoClassDefFoundError: com/myCompany/BasicTest<br />
        at com.myCompany.Runner.main(Runner.java:7)<br />
Caused by: java.lang.ClassNotFoundException: com.myCompany.BasicTest<br />
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)<br />
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)<br />
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)<br />
        ... 1 more


Richard MacCutchan

Вы должны добавить те же параметры пути к классу, что и на этапе компиляции.

Richard MacCutchan

Что касается вашего первого пункта, то подразумевается, что BasicTest находится в com.myCompany, когда вы пытаетесь скомпилировать Runner.java. Потому что в этот момент компилятор не знает, где он находится, поэтому ему нужен путь к классу, чтобы пойти и найти класс.

mgoblue0970

Спасибо! Эта работа. Не понимал, что cp нужен для его запуска; просто предположил компиляцию. Между тем, как стать зависимым от IDE и использовать интерпретируемый язык, мне нужно немного освежить свои знания!