Non mi era mai capitata una situazione del genere... 
Il problema non stà nel fatto che la classe debba essere portata dentro al main, in quanto all'interno di un metodo di solito non si definiscono classi (la cosa è possibile, ma inutile).
Credo che il problema sia una finezza: la tua classe Libro è una classe interna, quindi può essere referenziata, all'esterno (in quanto public) tramite la seguente dicitura:
codice:
prova.Libro l = new prova.Libro();
All'interno della tua classe, questo si traduce in questo modo:
codice:
Libro l = new this.Libro();
Questo provoca un errore, perchè all'interno di un contesto statico (public static void main(String [] args) ) non si possono referenziare variabili o metodi non statici (ed il this è una variabile non statica).
Il tuo problema si risolve facilmente utilizzando un costruttore per la classe primo e creando un oggetto della stessa classe:
codice:
public class primo {
public class Libro {
String autore;
String titolo;
public Libro(String a, String t) {
autore = a;
titolo = t;
}
public String getAutore() {
return autore;
}
public String getTitolo() {
return titolo;
}
}
public primo() {
System.out.print("Eccomi! \nBenvenuto nel mondo java");
Libro libro1 = new Libro("Pippo", "Libro di pippo");
Libro libro2 = new Libro("Pluto", "Libro di pluto");
String autore1 = libro1.getAutore();
System.out.print(autore1);
}
public static void main(String args[]){
primo p = new primo();
}
}
PS: Ricordati di usare i tag [*CODE] e [*/CODE] senza l'asterisco, ovviamente, per mantenere l'indentazione del codice, che risulta così più leggibile.
Ciao.