- PR -

コンパイルエラーについて

1
投稿者投稿内容
みるく
会議室デビュー日: 2004/06/17
投稿数: 4
投稿日時: 2004-06-17 03:22
はじめまして。

Java初心者なので、とても初歩的な質問になると思いますが...。
教えて下さい。

下記のようにコンパイルするとエラーになってしまいます。
多分、コンパイル方法に問題があると思うのですが...。

C:\Tomcat5\webapps\no\WEB-INF>javac -d classes -classpath c:\tomcat5\common\li
b\servlet-api.jar src\jspbean\EmployeeDAO.java
src\jspbean\EmployeeDAO.java:62: シンボルを解決できません。
シンボル: クラス Employee
場所 : jspbean.EmployeeDAO の クラス
public void create(Employee emp){
^
src\jspbean\EmployeeDAO.java:83: シンボルを解決できません。
シンボル: クラス Employee
場所 : jspbean.EmployeeDAO の クラス
public int store(Employee emp){
^
src\jspbean\EmployeeDAO.java:48: シンボルを解決できません。
シンボル: クラス Employee
場所 : jspbean.EmployeeDAO の クラス
list.add(new Employee(number, name, age, depID, depName));
^
エラー 3 個
コード:
関連ファイル
package jspbean;

import java.sql.*;
import java.util.ArrayList;

public class EmployeeDAO{
   private final static String DRIVER_URL =
   "jdbc:mysql://localhost:3306/examdb?useUnicode=true&characterEncoding=Windows-31J";
   private final static String DRIVER_NAME = "com.mysql.jdbc.Driver";
   private final static String USER_NAME = "root";
   private final static String PASSWORD = "";
   
   protected Connection createConnection () {
     try {
        Class.forName(DRIVER_NAME);
        Connection con = DriverManager.getConnection(DRIVER_URL,USER_NAME,PASSWORD);
        return con;  
     } catch( ClassNotFoundException e ) {
        System.out.println("Can't Find JDBC Driver.\n");
     } catch( SQLException e ) {
        System.out.println("Connect Error.\n");
     }
      return null;
    }

   protected void closeConnection( Connection con ) {
      try {
         con.close( );
      } catch( Exception ex ) { }
   }
   
   public ArrayList findAll(){
      ArrayList list = new ArrayList();
      Connection con = null;
      try{
         con = createConnection();
         String sql = "select * from employee inner join department using(dep_id) order by number";
         Statement stmt = con.createStatement();
         ResultSet rs = stmt.executeQuery(sql);         
         while(rs.next()){
            int number = rs.getInt("number");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            int depID = rs.getInt("dep_id");
            String depName = rs.getString("dep_name");
            list.add(new Employee(number, name, age, depID, depName));
         }
         stmt.close();
         rs.close();                 
         return list;
      }catch(SQLException e){
         e.printStackTrace();   
         return null;
      }finally{
         closeConnection(con);
      }
   }

   public void create(Employee emp){
      Connection con = null;
      try{
         con = createConnection();
         String sql ="insert into employee values(?, ?, ?, ?)";
         PreparedStatement stmt = con.prepareStatement(sql);
         stmt.setInt(1, emp.getNumber());
         stmt.setString(2, emp.getName());
         stmt.setInt(3, emp.getAge());
         stmt.setInt(4, emp.getDepID());           
         stmt.executeUpdate();
      }catch(SQLException e){
         System.err.println("従業員の追加失敗");
         e.printStackTrace();
      }finally{
         closeConnection(con);   
      }
   }

  public int store(Employee emp){
    Connection con = null;
    int updated = 0;
    try{
      con = createConnection();
      int number = emp.getNumber();
      int dep_id = emp.getDepID();
      String sql ="update employee set dep_id="
                 + dep_id + " where number=" + number;
      Statement stmt = con.createStatement();
      updated = stmt.executeUpdate(sql);
      return updated;
    }catch(SQLException e){
      System.out.println("従業員テーブルの更新失敗");
      e.printStackTrace();
      return -1;
    }finally{
      closeConnection(con);   
    }
  }   
}

-----
関連ファイル
package jspbean;

public class Employee {
    private int mNumber;
    private String mName;
    private int mAge;
    private int mDepID;
    private String mDepName;
    
    public Employee(int number, String name, int age,
                     int depID, String depName){
        this.mNumber = number;
        this.mName = name;
        this.mAge = age;
        this.mDepID = depID;
        this.mDepName = depName;
    }

    public Employee(){
    }
    
    public int getNumber() {return mNumber;}
    public void setNumber(int i) {mNumber = i;}

    public String getName() {return mName;}
    public void setName(String string) {mName = string;}

    public int getAge() {return mAge;}
    public void setAge(int i) {mAge = i;}

    public int getDepID() {return mDepID;}
    public void setDepID(int i) {mDepID = i;}

    public String getDepName() {return mDepName;}
    public void setDepName(String string) {mDepName = string;}
}



長くなってしまってすみません。
入門書,サイトで調べてみたんですが、わかりませんでした。
以上、よろしくお願いいたします。
ぼんじぃ
ベテラン
会議室デビュー日: 2004/05/21
投稿数: 70
投稿日時: 2004-06-17 08:30
クラスパスが悪いせいだと思います。
-classpath .;c:\tomcat5\common\lib\servlet-api.jar
でコンパイルしてみてください。

ちなみにこのソースならクラスパスは要らないのでは?
みるく
会議室デビュー日: 2004/06/17
投稿数: 4
投稿日時: 2004-06-17 11:55
返信ありがとうございます。

下記のようにコンパイルしてみましたが、同じようにエラーになりました。

C:\Tomcat5\webapps\no\WEB-INF>javac -d classes -classpath .;c:\tomcat5\common\
lib\servlet-api.jar src\jspbean\EmployeeDAO.java

このソースににクラスパスが要らないのは、何故ですか?
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-06-17 12:08
「シンボルを解決できません。」というのは、「Employee」がなんのことか
コンパイラが判断できなかったということです。
コンパイル時に他のクラスを参照する場合、クラスパスにルートディレクトリ
(パッケージの先頭のディレクトリの存在するディレクトリ)が含まれている
必要があります。今クラスパスが通っているディレクトリは、「.」が表すカレントの
 C:\Tomcat5\webapps\no\WEB-INF\
だけですが、Employeeクラスは以下の場所に存在していますか?
 C:\Tomcat5\webapps\no\WEB-INF\jspbean\Employee.class

引用:

このソースににクラスパスが要らないのは、何故ですか?


ぼんじいさんではありませんが、ServletAPIを使用していないので、クラスパスに
servlet-api.jarを含めなくても良いということではないかと思います。
# 微妙に修正

[ メッセージ編集済み 編集者: taro 編集日時 2004-06-17 12:12 ]
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-06-17 12:39
エラーから判断するにEmployeeが無いからコンパイルできない
のだからまずEmployeeをコンパイルしているのでしょうか?

あとクラスパスの指定も”.”を追加していますが
".\classes"じゃないでしょうか?

どちらにしてもEmployeeとEmployeeDAOを一緒にコンパイルすれば
解決すると思うんですが、、
下記のような感じで試してみてください。

C:\Tomcat5\webapps\no\WEB-INF>javac -d classes -classpath .\classes;c:\tomcat5\common\
lib\servlet-api.jar src\jspbean\*.java


みるく
会議室デビュー日: 2004/06/17
投稿数: 4
投稿日時: 2004-06-17 12:57
taroさん,いっきゅうさんありがとうございます。

引用:

「シンボルを解決できません。」というのは、「Employee」がなんのことか
コンパイラが判断できなかったということです。


その通りだと思っていましたが、解決法がわかりませんでした...。
Employeeクラスは
C:\Tomcat5\webapps\no\WEB-INF\classes\jspbean\Employee.class
にあります。
とりあえず
C:\Tomcat5\webapps\no\WEB-INF>javac -d classes -classpath .\classes;c:\tomcat5\common\lib\servlet-api.jar src\jspbean\*.java
でコンパイルできました。ありがとうございました。

引用:

あとクラスパスの指定も”.”を追加していますが
".\classes"じゃないでしょうか?


何故必要なのですか?

引用:

ServletAPIを使用していないので、クラスパスに
servlet-api.jarを含めなくても良いということではないかと思います。


どれがServletAPIを使用するのか理解ができていなくて...。

[ メッセージ編集済み 編集者: みるく 編集日時 2004-06-17 13:03 ]
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-06-17 13:52
引用:
引用:
あとクラスパスの指定も”.”を追加していますが
".classes"じゃないでしょうか?


何故必要なのですか?


分かっていることだったらすみません。
Employeeクラスにクラスパスが通っていないからコンパイルエラーが起きていたわけですよね。
引用:

Employeeクラスは
C:Tomcat5webappsnoWEB-INFclassesjspbeanEmployee.class
にあります。


ので、Employeeクラスのルートである
 C:\Tomcat5\webapps\no\WEB-INF\classes
にクラスパスが通っている必要があるのです。
これをコンパイル時のカレントディレクトリからの相対パスで表すと./classになります。
(絶対パス、相対パスはどちらを使ってもOKです)
引用:
引用:

ServletAPIを使用していないので、クラスパスに
servlet-api.jarを含めなくても良いということではないかと思います。


どれがServletAPIを使用するのか理解ができていなくて...。


以下がServletAPIです。tomcatでの実行時にはパスが通っているので、
コンパイル時にも含めることは正しいと思いますが。
(ぼんじいさんのコメントの自分なりの解釈ですので、間違ってたらごめんなさい)
http://www.ingrid.org/jajakarta/servletapi/servletapi-4.0/docs-ja/
みるく
会議室デビュー日: 2004/06/17
投稿数: 4
投稿日時: 2004-06-17 14:12
ありがとうございました。

これですっきりしました。
この問題が解決できないとこの先大変だと思っていたので...。
1

スキルアップ/キャリアアップ(JOB@IT)