Kompilacja java

0

Mam pliki mojego programu :

katalog 1

  • plik1.java
  • katalog 2
    • plik2.java

gdzie w pliku "plik2.java" mam

import plik1;

dostaję błędy kompilacji:

plik1.java ';' expected
import plik2;

jak poprawnie zaimportować ten plik? nie mogę inaczej zorganizować plików programu

0

To też daje błędy:

import katalog1.plik1;
0

Nie, średniki są, to nie to...

0

w plik2 masz jak rozumiem package katalog2, a kompilacja odbywa się z folderu katalog1?

0

Ok, podam więcej szczegółów, bo może to nie zależy od tego (?)

Mam interfejs w *.idl:

interface Class1;

interface Class2
{
    typedef sequence<Class1> vector;
    Class2 create();
};

interface Class1
{
    typedef sequence<Class2> vector;
    Class1 create();
};

Kompiluję go tak:

idlj -fclient interface.idl

To daje mi pliki:

Class1Helper.java Class2.java interface.idl
Class1Holder.java _Class1Stub.java Class2Operations.java
Class1.java Class2Helper.java
Class1Operations.java Class2Holder.java _Class2Stub.java

i katalogi:

Class1Package Class2Package

w katalogu Class1Package są takie wygenerowane pliki:

vectorHelper.java vectorHolder.java

w katalogu Class2Package są takie wygenerowane pliki:

vectorHelper.java vectorHolder.java

wchodzę do katalogu Class1Package i wpisuję "javac *.java", i dostaję błędy:

vectorHelper.java '.' expected import Class2; vectorHelper.java ';' expected import Class2; vectorHelper.java class, interface, or enum expected import Class2Helper; vectorHolder.java '.' expected import Class2; vectorHolder.java ';' expected import Class2; 5 errors Class1Package$ javac *.java vectorHelper.java '.' expected import Class2; vectorHelper.java ';' expected import Class2; vectorHelper.java class, interface, or enum expected import Class2Helper; vectorHolder.java '.' expected import Class2; vectorHolder.java ';' expected import Class2; 5 errors

To mój cały projekt:

http://www41.zippyshare.com/v/32339153/file.html

0

Nikt nie wie?

0
import Class1;

To jest źle.
Problem w tym, że w Javie nie da się importować z domyślnego pakietu.
Musisz zmusić toto, żeby ci te pliki generowało w jakimś konkretnym pakiecie.

1

Kompilator idlj ma opcję -pkgPrefix, która umieszcza klasy we wskazanym pakiecie.

0

@bogdans: Co do tej opcji - próbowałem, i nie działa:/ a przynajmniej nie tak, jak bym tego chciał. Muszę mieć wszystko w module (a nie mogę w tym przypadku używać modułów), poza tym, nie mogę tego zrobić, jeśli mam zdef 2 interfejsy w 1 pliku, a muszę tak mieć, bo inaczej idlj krzyczy, że nie zdef wcale tego drugiego interfejsu, chociaż go zdefiniowałem, chyba idlj nie uznaje deklaracji zapowiadających ... masakra jakaś.

@iooi: Próbowałem ręcznie wsadzić toto do jakiegoś katalogu, i wkleić tam ręcznie klasy, ale doopa, bo i tak "nie działa"

Ktoś jeszcze się wypowie?

1

Nie wystarczy wsadzić ręcznie do katalogu, trzeba dopisać instrukcję package....

0

Aż takim idiotą nie jestem :] pisałem, że dopisałem do każdego pliku "package", ale dalej nic

0

@bogdans: Zobacz, może jestem jednak idiotą, i czegoś nie widzę: http://www10.zippyshare.com/v/84690665/file.html,

przy kompilacji w pakiecie Class1Package, mam błędy:

vectorHelper.java package DefaultPack does not exist
import DefaultPack.Class2;
^
vectorHelper.java package DefaultPack does not exist
import DefaultPack.Class2Helper;
^
vectorHelper.java cannot find symbol
symbol : class Class2
location: class Class1Package.vectorHelper
public static void insert (org.omg.CORBA.Any a, Class2[] that)
^
vectorHelper.java cannot find symbol
symbol : class Class2
location: class Class1Package.vectorHelper
public static Class2[] extract (org.omg.CORBA.Any a)
^
vectorHelper.java cannot find symbol
symbol : class Class2
location: class Class1Package.vectorHelper
public static Class2[] read (org.omg.CORBA.portable.InputStream istream)
^
vectorHelper.java cannot find symbol
symbol : class Class2
location: class Class1Package.vectorHelper
public static void write (org.omg.CORBA.portable.OutputStream ostream, Class2[] value)
^
vectorHolder.java package DefaultPack does not exist
import DefaultPack.Class2;
^
vectorHolder.java cannot find symbol
symbol : class Class2
location: class Class1Package.vectorHolder
public Class2 value[] = null;
^
vectorHolder.java cannot find symbol
symbol : class Class2
location: class Class1Package.vectorHolder
public vectorHolder (Class2[] initialValue)
^
vectorHelper.java cannot find symbol
symbol : variable Class2Helper
location: class Class1Package.vectorHelper
__typeCode = Class2Helper.type ();
^
vectorHelper.java cannot find symbol
symbol : class Class2
location: class Class1Package.vectorHelper
Class2 value[] = null;
^
vectorHelper.java cannot find symbol
symbol : class Class2
location: class Class1Package.vectorHelper
value = new Class2[_len0];
^
vectorHelper.java cannot find symbol
symbol : variable Class2Helper
location: class Class1Package.vectorHelper
value[_o1] = Class2Helper.read (istream);
^
vectorHelper.java cannot find symbol
symbol : variable Class2Helper
location: class Class1Package.vectorHelper
Class2Helper.write (ostream, value[_i0]);
^
14 errors

1

Ja nie widzę w katalogu Class1Package pakietu DefaultPack. Masz co najmniej dwa wyjścia:

  • skopiować katalog DefaultPackage do Class1Package,
  • kompilować tak: *javac -cp .. .java.
0

@bogdans: dziękuję, jednak jestem idiotą Xd ale to nic, najważniejsze, że dało radę. Dziękuję,bardzo mi pomogłeś!:)

0

@bogdans: mam jeszcze jedno pytanie.

Mam drzewo katalogów:

  • kat1
    • kat2
      • kat3
      • kat4

jestem aktualnie w katalogu kat1, a chcę skompilować pliki w katalogach kat3 oraz kat4 z tym, że one w swoim argumencie dla -cp korzystają z plików w katalogu kat2 jak to zrobić? Zaznaczam, że nie mogę inaczej zorganizować układu katalogów.

Próbowałem:

javac -cp kat2/ kat2/kat3/*.java
, ale mam błędy jak poprzednio. Da się?

1

Za cp możesz podać listę katalogów oddzielonych średnikami
javac -cp kat2;kat2/kat3;kat2/kat4;

0

@bogdans: tzn nie wiem, czy mnie dobrze zrozumiałeś. Gdybym był w katalogu kat3 wydałbym polecenie:

javac -cp .. *.java

bo Twoje polecenie daje mi znów te same błędy. A mi chodzi o wydanie polecenia adekwatnego, tylko w katalogu kat1

1

Czytałem po łebkach, powinno działać takie polecenie javac kat2/kat3/*.java, analogicznie dla kat4. (Zakładam, że w klasach z katalogów kat3 i kat4 masz import pakietu kat2.)

0

@bogdans: dziękuję.

Jeszcze jedno i już Cię nie męczę, jeśli byś mógł pomóc.

Jeśli mam takie drzewo katalogów:

  • kat1
    • kat2
    • kat3
    • kat4

Będąc w katalogu kat2 (lub kat3 lub kat4) musiałbym wydać polecenie: *javac -cp .. .java, a co zrobić, jeśli jestem w katalogu kat1 i chcę zrobić to samo (importy wszystkie mam)?

0

Ok, juz się nie kłopocz ;) - wystarczyło dać:

javac kat2/*.java

dziękuję ślicznie

1

javac kat3/*.java
//edit, spóźniłem się ;)

0

A jednak, znów problem - tym razem z uruchomieniem programu, który napisałem (z kompilacją na szczęście już wszystko ok).

Mam katalogi:

  • client
    • interfaces/InterfacePackage/ -----> duużo plików, w tym AppInterfaceHelper.java i AppInterfaceHelper.class
    • implementations/client.java

chcę uruchomić klienta (client.java, gdzie klient ma import: import InterfacePackage.*; ) o, tak (jestem w katalogu implementations):

java client -ORBInitRef NameService=corbaloc::localhost:2809/NameService

ale dostaję błędy:

Exception in thread "main" java.lang.NoClassDefFoundError: InterfacePackage/AppInterfaceHelper
at Client.main(Client.java:34)
Caused by: java.lang.ClassNotFoundException: InterfacePackage.AppInterfaceHelper
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 1 more

coś mi się zdaje, że to dlatego, że klient nie widzi pliku "AppInterfaceHelper" ... jak mogę inaczej uruchomić klienta, żeby zadziałał?

0

@bogdans: szukając w google odpowiedzi/pomocy natknąłem się na Twój post: http://4programmers.net/Forum/Newbie/200946-java_szukanie_wartosci_w_kolumnie?start=30 (ostatni post na tej stronie) który bardzo mi pomógł, klient się uruchomił, skopiowałem katalog **interfaces/InterfacePackage/ ** do katalogu implementations i śmiga.

Wszystko wspaniale, ale czy nie można tego zrobić tak, jak chciałem? Jest to możliwe? Jest na to jakiś sposób? Dzięki ;)

0

Wie ktoś? ^^ cały dzień się z tym męczę i nic

1

Polecenie java też ma parametr -cp. Możesz podać listę katalogów (plików jar), w których JVM ma szukać klas.

0

@bogdans: No właśnie próbowałem (znalazłem w dokumentacji), coś takiego:

java -cp ../Interfaces/ Client -ORBInitRef NameService=corbaloc::localhost:2809/NameService

ale dostaję:

Exception in thread "main" java.lang.NoClassDefFoundError: Client
Caused by: java.lang.ClassNotFoundException: Client
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: Client. Program will exit.

  1. Natomiast to:
java -cp ../Interfaces/;. Client -ORBInitRef NameService=corbaloc::localhost:2809/NameService

daje mi:

Usage: java [-options] class [args...]
(to execute a class)
or java [-options] -jar jarfile [args...]
(to execute a jar file)
where options include:
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
-client to select the "client" VM
-server to select the "server" VM
-jamvm to select the "jamvm" VM
-cacao to select the "cacao" VM
-zero to select the "zero" VM
-hotspot is a synonym for the "client" VM [deprecated]
The default VM is server,
because you are running on a server-class machine.

-cp <class search path of directories and zip/jar files>
-classpath <class search path of directories and zip/jar files>
              A : separated list of directories, JAR archives,
              and ZIP archives to search for class files.
-D<name>=<value>
              set a system property
-verbose[:class|gc|jni]
              enable verbose output
-version      print product version and exit
-version:<value>
              require the specified version to run
-showversion  print product version and continue
-jre-restrict-search | -jre-no-restrict-search
              include/exclude user private JREs in the version search
-? -help      print this help message
-X            print help on non-standard options
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
              enable assertions with specified granularity
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
              disable assertions with specified granularity
-esa | -enablesystemassertions
              enable system assertions
-dsa | -disablesystemassertions
              disable system assertions
-agentlib:<libname>[=<options>]
              load native agent library <libname>, e.g. -agentlib:hprof
              see also, -agentlib:jdwp=help and -agentlib:hprof=help
-agentpath:<pathname>[=<options>]
              load native agent library by full pathname
-javaagent:<jarpath>[=<options>]
              load Java programming language agent, see java.lang.instrument
-splash:<imagepath>
              show splash screen with specified image

See http://java.sun.com/javase/reference for more details.
bash: Client: Nie ma takiego pliku ani katalogu

1

Linux? Separatorem katalogów w parametrze cp jest przecinek, nie średnik.

0

@bogdans: dziekuję, już próbuję:) Tak, zapomniałem napisać; Kubuntu 12.04.

Próbowałem:

java -cp ../Interfaces/,./ Client -ORBInitRef NameService=corbaloc::localhost:2809/NameService

daje:

Exception in thread "main" java.lang.NoClassDefFoundError: Client
Caused by: java.lang.ClassNotFoundException: Client
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: Client. Program will exit.

java -cp ./,../Interfaces/ Client -ORBInitRef NameService=corbaloc::localhost:2809/NameService

ten sam błąd, jak wyżej

java -cp .,../Interfaces Client -ORBInitRef NameService=corbaloc::localhost:2809/NameService

także błąd jak wyżej :(

1

Czasami piszesz client, czasami Client, czasami interfaces, czasami Interfaces. Ty masz świadomość, że Linux i Java są case-sensitive? ;)

0

@bogdans: Tak wiem, trochę namieszałem. Ale u siebie na dysku mam wszystko z dużej litery, tylko na forum pisałem różnie, nie chciałem wprowadzać w błąd, przepraszam. Mimo tego, że z dużej litery wszystko i nawet w kliencie (Client.java) mam :

public class Client {//..}

i już sam nie wiem, czemu "nie działa" :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1