->
ちょっとハマッたのでメモ.
JavaでTCPサーバを書いてWindowsのコマンドプロンプトでコンパイルして実行しようとすると,
java TCPServer
Exception in thread "main" java.lang.NoClassDefFoundError: tcp/TCPServer (wrong name: tcp/TCPServer)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: tcp.TCPserver. Program will exit.
という,エラー.
コンパイルは通る,classファイルもある.
どうしたものかと思って原因を調べると,原因が判明.
どうやらJavaのクラスファイルは、
packageの階層と同じディレクトリ構造にしないといけないらしく.
この例であれば、tcpserverというディレクトリを作り、
その中にコンパイルしたTCPServer.classを入れ、tcpserverの上位ディレクトリから
java tcpserver.TCPServer
もしくは
java tcpserver/TCPServer
で起動できるらしい.
Java未だによく分かってない.
勉強せねば...
参考リンク
実行時のNoClassDefFoundErrorが解決できません (http://oshiete1.goo.ne.jp/qa3105812.html)
EclipseでGoogleのAPIをいじるプログラムを書こうと思い、Coding in the Shade: Using Eclipse with Google Data APIsを見ながら設定していたのだが、いつまでもサンプルプログラムが動かず苦労したので、ここに導入方法をまとめておく。
Eclipse導入・目次
1.
Eclipseのダウンロード
2.
GData Java Client Libraryのダウンロード
3.
その他必要なライブラリのダウンロード
4.
サンプルプロジェクトの作成
5.
サンプルプログラムの実行
まずは、
公式サイトからEclipseを落とす。いろいろ種類があるが、ひとまず「
for Java Developers」で大丈夫そう。DLが終わったら、起動して適当な場所にworkspaceを作成する。
続いて様々な機能を提供してくれる
GData Java Client Libraryをダウンロードしてくる。
ここからダウンロード可能。ライブラリの中身も見たい人は
srcをダウンロードしてもいいが、APIを利用するだけであれば、
samplesの方でOK。解凍したら、eclipseフォルダに入れておく。
そのほか必要になるファイルをダウンロードしてくる。
これらのファイルは、
eclipse/gdata/third_partyに入れておく。
適当な名前のプロジェクトを新規作成し、最下部の「next」を押す。上のタブから「Libraries」を選び、「Add External JARs」から、
/gdata/java/libにある
gdata-client, gdata-client-meta, gdata-core, gdata-media, data-docs, gdata-docs-metaを追加する。
次に、3で
/gdata/third_partyに保存した
mail.jar, servlet-api.jar, activation.jarを読み込む。
Googleのドキュメントには上のライブラリを読み込めばいいと書いてあるが、これだけでは何度やってもサンプルプログラムで “
java.lang.NoClassDefFoundError“エラーが出てしまっていたが、
gdata/java/depsにある
google-collectと
jsrを読み込むことで解決した。
ここまで来れば、あと一息。Googleドキュメントの文書タイトルを読み込むサンプルプログラムを実行してみる。
import java.net.URL;
import com.google.gdata.client.docs.DocsService;
import com.google.gdata.data.docs.DocumentListEntry;
import com.google.gdata.data.docs.DocumentListFeed;
public class testDocumentsList {
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
DocsService service = new DocsService("Document List Demo");
service.setUserCredentials("your_id@gmail.com", "your_password");
URL documentListFeedUrl = new URL("http://docs.google.com/feeds/documents/private/full");
DocumentListFeed feed = service.getFeed(documentListFeedUrl, DocumentListFeed.class);
for(DocumentListEntry entry : feed.getEntries()) {
System.out.println(entry.getTitle().getPlainText());
}
}
catch(Exception ex){
System.out.println("Exception: "+ ex.getMessage());
}
}
}
このとき、アカウント情報を追加しておくことをお忘れなく。これを実行すればコンソールにGoogleドキュメントに保存された文書のタイトルが表示されるはずである。
以上が、EclipseでJavaを使ってGoogle APIをいじるため下準備であった。
関連書籍



Javaでクラスの配列を作った場合、newしただけでは初期化されないらしい。
class example[] = new example[10];
では、null Exception Errorが出てしまうので、
class example[] = new example[10];
for(int i=0; i<10; i++){
example[i] = new example();
とすると大丈夫なようだ。
ところで,Javascriptならオライリーのラクダ,Perlならラクダ本などがあるが,Javaの入門書ってあまり評判のいい本の話を聞かない.僕自身も,大体は授業のプリントとAPIドキュメントで一通り学んだ気がする.気になったので,Amazonで調べてみたら,以下の本の評判がよさそうだと感じた.
よくわかるJava (単行本)