Capítulo 10 - Development

7 respostas
deyvid

Na questão 3

foo
|----test
         |----xcom
                   |---- A.class
                   |---- B.java

package xcom;
public class A { }

package xcom;
public class B extends A { }

Eu não entendi por que

B. Set the current directory to xcom then invoke
     javac -classpath . B.java

D. Set the current directory to test then invoke
    javac -classpath xcom B.java

E. Set the current directory to test then invoke
    javac -classpath xcom:. B.java

Estão incorretas.

Desde já agradeço.

7 Respostas

deyvid

Acabo de fazer um teste assim,

package wicked;
public class MyClass {}

no diretório wicked;

fiz

…? alguém me ajuda …

ribclauport

Vamos analisar o que está acontecendo:

primeira alternativa

B. Set the current directory to xcom then invoke
javac -classpath . B.java

C:\Projetos\foo\test\xcom>javac A.java

C:\Projetos\foo\test\xcom>javac -classpath . B.java
B.java:2: cannot find symbol
symbol: class A
public class B extends A { } →
                       ^
1 error

Veja que o classpath foi setado para xcom, sendo assim a procura será feita por uma classe que tenha a entrada seguinte:

xcom.A, ou seja dentro de xcom, não tem um pacote xcom, o que você tem que entender é que existe uma declaração package, e sendo assim a entrada para o classpath teria que ser xcom.A, o compilador está procurando o pacote xcom dentro de xcom, o qual tem um A!, ele pensa assim:

Estou dentro de xcom e encontrei um ".", vou procurar o que é preciso para compilar, preciso de uma classe chamada "xcom.A", vou começar entrando dentro de um pacote chamado "xcom", opa não existe nenhum pacote chamado xcom!, vou lançar uma exeção. dizendo que não consegui encontrar o simbolo "A", pois não existe esse caminho!

A mesma coisa está acontecendo nas outras alternativas!

Agora o teste que você fez é diferente, você não colocou um package na declaração da classe, e ae pediu para procurar com classpath local, ae deu certo, veja que são situações distintas.

Qualquer coisa pergunte.

deyvid

Caro ribclauport muito obrigado pela boa vontade em ajudar.

Não querendo se abusado, uma pequena dúvida em relação ao meu teste.

eu utilizei a instrução package wicked; não é mesma coisa? E o que acontece quando não tem essa instrução

Desde já agradeço

ribclauport

Eu estou com o livro em “Português”, não sei qual será a página, se você está usando em “Inglês”, que é melhor lógico…heheh

Tem um subtítulo no meu livro na página 446 “Declarando e Usando Classpaths”, depois logo abaixo tem “Observação para o exame” e mais abaixo tem o seguinte trecho:

-classpath /com/foo/acc:/com/foo:.

Esse classpath é idêntico ao anterior, EXCETO pelo fato de que o ponto (.) ao final da declaração instrui java ou javac a procurar por arquivos de classe também no diretóriio atual.(Lembre-se de que estamos falando de arquivos de classes - quando você está dizendo a javac qual arquivo.java compilar, javac procura no diretório atual por padrão.)

Se você verificar a afirmação acima, é justamente seu caso, apesar de sua classe estar em um “package”, você navegou até o pacote em que ela está,
e executou javac, o mesmo incluiu o arquivo em (.), e foi compilado. São detales especialmente “diabólicos” como diz o livro.

deyvid

Desculpe minha burrice, mas não encherguei a diferença entre /wicked/MyClass.java E /xcom/B.java

e também não enchergo a diferença entre javac -cp . myClass.java E javac -classpath . B.java

Obrigado pela paciência

:oops:

ribclauport

No caso citado por você, está compilando um arquivo, o qual usa outra classe,

veja:

package xcom; public class B extends A { }

e ai está usando o classpath para a procura das classes necessárias para compilar o arquivo, ou seja a classe A!. A diferença, é que em um caso você colocou sua classe em um pacote, e está apenas compilando o arquivo.java, a partir do diretório corrente.

ribclauport

De acordo com a sua dúvida, também tive dúvida quanto ao classpath, com relação a compilar arquivo único, acabei abrindo outro tópico.

http://www.guj.com.br/java/268908-javac-como-usar-para-procurar-arquivojava#1409513

Criado 26 de março de 2012
Ultima resposta 28 de mar. de 2012
Respostas 7
Participantes 2