Aiuto con i pacchetti in java – l’importazione non funziona

Sono uno sviluppatore C ++, non uno sviluppatore Java, ma devo far funzionare questo codice …

Ho 2 classi pubbliche che verranno utilizzate da un altro prodotto. Ho usato la direttiva del pacchetto in ciascuno dei file java.

package com.company.thing; class MyClass ... 

Quando provo a compilare un’app di test che utilizza ciò che aggiungo

 import com.company.thing.*; 

Il compilatore javac fallisce con errori su com.company non esiste. (anche se lo compilo nella stessa directory dei file di class che ho appena creato)

Sono sicuro che sto facendo qualcosa di ossuto e stupido.

Ho letto le pagine http://java.sun.com/docs/books/tutorial/java/package/usepkgs.html e ho provato ad impostare una struttura di directory come / com / company / thing ecc, ma o ho totalmente rovinato tutto o mi manca qualcos’altro.

EDIT grazie per i suggerimenti – avevo già provato il classpath. Non aiuta

Ho provato a compilare

 javac -classpath  client.java 

e il risultato è:

 package com.company does not exist 

Ho il codice che voglio importare (i due file java) in \ com \ company \ product. Compilo quelle bene. (contengono MyClass) Ho persino creato un file jar per loro. Ho copiato il file jar nella directory superiore.

Ho quindi fatto (nella directory padre con il file java del client)

 javac -cp  *.java 

il risultato è:

 cannot access MyClass bad class file: MyClass.class(:MyClass.class) class file contains wrong class: com.company.product.MyClass Please remove or make sure it appears in the correct subdirectory of the classpath. 

MODIFICARE

Ho ottenuto il codice client da compilare ed eseguire se ho usato il nome completo per MyClass e lo ho compilato nella directory superiore. Sono completamente confuso ora.

compilato senza set di classpath – solo

 javac *.java 

nella directory superiore – e ha funzionato bene.

Posso compilare una app di test, ma non la taglierò quando devo integrarla nel codice di produzione. Sto ancora cercando aiuto.

MODIFICARE:

Infine, non sono sicuro del motivo per cui non ha funzionato prima, ma ho pulito tutti i file su tutta la struttura della directory e ora funziona.

Grazie

Ok, solo per chiarire cose che sono già state pubblicate.

Dovresti avere la directory com , contenente la directory company , contenente l’ example directory, contenente il file MyClass.java .

Dalla cartella contenente com , esegui:

 $ javac com \ company \ example \ MyClass.java

Poi:

 $ java com.company.example.MyClass
 Ciao da MyClass!

Questi devono essere entrambi fatti dalla radice dell’albero dei sorgenti. In caso contrario, javac e java non saranno in grado di trovare altri pacchetti (infatti, java non sarebbe nemmeno in grado di eseguire MyClass ).

Un breve esempio

Ho creato le cartelle “testpackage” e “testpackage2”. All’interno di testpackage, ho creato TestPackageClass.java contenente il seguente codice:

 package testpackage; import testpackage2.MyClass; public class TestPackageClass { public static void main(String[] args) { System.out.println("Hello from testpackage.TestPackageClass!"); System.out.println("Now accessing " + MyClass.NAME); } } 

All’interno di testpackage2, ho creato MyClass.java contenente il seguente codice:

 package testpackage2; public class MyClass { public static String NAME = "testpackage2.MyClass"; } 

Dalla directory contenente le due nuove cartelle, ho eseguito:

 C: \ esempi> javac testpackage \ *. Java

 C: \ esempi> javac testpackage2 \ *. Java

Poi:

 C: \ examples> java testpackage.TestPackageClass
 Ciao da testpackage.TestPackageClass!
 Ora accede a testpackage2.MyClass

Ciò rende le cose più chiare?

Sì, questo è un problema di classpath. È necessario indicare al compilatore e al runtime che la directory in cui risiedono i file .class fa parte di CLASSPATH. La directory che devi aggiungere è la parent della directory “com” all’inizio della struttura del pacchetto.

Lo fai usando l’argomento -classpath per javac.exe e java.exe.

Dovresti anche chiedere come sono suddivise le classi di terze parti che stai utilizzando. Se sono in un JAR e ti consiglio di averli in uno, aggiungi il file .jar al classpath:

 java -classpath .;company.jar foo.bar.baz.YourClass 

Google per “classpath Java”. Troverai link come questo .

Un’altra cosa: “import” non sta caricando le classi. Tutto ciò ti fa risparmiare la digitazione. Quando si include una dichiarazione di importazione, non è necessario utilizzare il nome di class completamente risolto nel codice, è ansible digitare “Foo” anziché “com.company.thing.Foo”. Questo è tutto ciò che sta facendo.

Sembra che tu sia sulla strada giusta con la tua struttura di directory. Quando si compila il codice dipendente, specificare l’argomento -classpath di javac . Utilizzare la directory padre della directory com , dove com , a sua volta, contiene company/thing/YourClass.class

Hai un sacco di buone risposte, quindi ti lascio solo un suggerimento. Se lavorerai a questo progetto per più di 2 giorni, scarica eclipse o netbeans e crea il tuo progetto lì.

Se normalmente non sei un programmatore Java, l’aiuto che ti darà sarà inestimabile.

Non vale il download / installazione della durata di un’ora se si impiegano solo 2 ore.

Entrambi hanno tasti di scelta rapida / voci di menu in “Correggere le importazioni”, con questo non dovresti mai più preoccuparti delle importazioni.

Il classloader Java standard è un stickler per la struttura delle directory. Ogni voce nel classpath è una directory o un file jar (o un file zip, in realtà), che cerca quindi il file di class specificato. Ad esempio, se il classpath è “.; My.jar”, cercherà com.example.Foo nelle seguenti posizioni:

 ./com/example/ my.jar:/com/example/ 

Cioè, cercherà nella sottodirectory che ha il ‘nome modificato’ del pacchetto, dove ‘.’ viene sostituito con il separatore di file.

Inoltre, è interessante notare che non è ansible nidificare file .jar.

Basta aggiungere la voce classpath (intendo la posizione della directory principale) nel menu Variabili di sistema e Variabili utente … Segui: Fare clic con il tasto destro del mouse su Risorse del computer> Proprietà> Avanzate> Variabili di ambiente