• 締切済み

パッケージ名をマッピング等して複数名で参照したい

とんでもない質問かもしれませんが、もし可能なら是非行いたいことがあり、ご教授下さい。 Javaのソース(hogehoge.java)にパッケージ名を付けています。  例:Package hoge.test; このソースは通常のJavaクラスであり、public static void mainを含まない部品群のクラスだと思って下さい。 このクラスをjarファイルとしてまとめて各プロジェクトで利用しているものとします。 さて、ここからが本題です。 この部品群のパッケージ名を変更しなければならなくなった場合、通常なら部品群であるソースのパッケージ名を変更しなければならないと思っています。 (例えば規約変更の影響で) ただ、この名前で既に他のプロジェクトで利用していることもあり、この部品群を利用する為に記述しているimport句を全て直して行くというのは大変です。 また、部品群の障害や拡張等があった場合に部品群だけを提供することにしており、他人がこの部品群を利用して作成したものが動かなくなってしまいます。 そこで、これら部品群のパッケージ名はそのままとし、別名のパッケージ名で呼び出すというマッピングの様なことは可能なのでしょうか?  ○今までのプロジェクトでの指定方法    import hoge.test.hogehoge;  ○今後のプロジェクトでの指定方法    import org.hoge.test.hogehoge; 以上、宜しくお願いいたします。

  • Java
  • 回答数2
  • ありがとう数3

みんなの回答

noname#235174
noname#235174
回答No.2

import hoge.test.hogehoge; にあった今までのクラスを import org.hoge.test.hogehoge; にすべて移動させた上で import hoge.test.hogehoge; には同名のクラスを作成し、publicなクラスは移動した クラスを継承してしまうという逃げ方はどうでしょう? 嫌な逃げ方ですが・・・。 もちろんimport hoge.test.hogehoge;のクラスは すべて@deprecated扱いで。

everfor
質問者

お礼

案を頂き、ありがとうございます。 私自身も継承を考えてみたのですが、本来のクラスのコンストラクタが 不可視(例えばprivateだったり)のものが存在する場合、 別のコンストラクタを明示的に宣言しないといけなくなり、 従来のパッケージでそのまま利用することが出来なくなってしまいます。 やはり、過去に開発したものについても全てパッケージ名を 新しくする方法しかないのかもしれませんね。。

  • chaoruko
  • ベストアンサー率53% (7/13)
回答No.1

eclipseなどのリファクタリングしてがっつり関連ファイルごとパッケージを変更するしかないと思いますよー リファクタリングは便利ですので試してみてください。 マッピングはできないと思います

everfor
質問者

お礼

ご回答いただき、ありがとうございます。 やはり、マッピングの様な事は出来ませんか・・・orz リファクタリング、便利ですね! ただ、質問にも書きました通り、部品群として提供しているもののため 私以外の方々への変更も依頼しないといけなくなります。 既に開発者の手から離れて利用されているものもありますので、 部品群の改変時にそれだけの入れ替えが出来ないという問題があります。 二重に持つしかないんですかね・・・

関連するQ&A

  • 無名パッケージからのインポート

    Javaの初学者です。 無名パッケージ内のクラスを、他のパッケージ中から呼びたいのですが、うまくいきません。 Test/src/Test.java ---- public class Test { public int m1; public Test() { m1 = 1; } } ---- という既存のプロジェクトがあるとします。 このプロジェクト内のTest.javaを利用したいと考えたとき、例えば、 Test2/src/Test2.java ---- import Test; public class Test2 { public static void main(String[] args) { Foo foo = new Foo(); System.out.println(foo.m1); } } ---- はうまくいきます。 ですが、Test2プロジェクトを Test2/src/test2/Test2.java ---- package test2; import Test; public class Test2 { public static void main(String[] args) { Foo foo = new Foo(); System.out.println(foo.m1); } } ---- のようにするとうまくいきません。 package test2の中から、外の無名パッケージのTestクラスを使用するには、どのようにすればよいでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • パッケージとビルドパス@eclipse

    eclipse3.1.2を使ってあるコードを書いています。次にあるのがこのプロジェクトの構造です。 Project: Aaa | default package-いくつかのファイル | aaa-いくつかのファイル | hoge.jar & hoge2.jar(2つのjarファイルはビルドパスで指定した) 質問はどのようにして、package aaa内にあるファイルがhoge.jarもしくはhoge2.jarにあるクラスを継承または実装するのか?です。 この2つのjarファイルに入っているクラスファイルはdefault package内では実装と継承ができるのですが、default package以外のpackageだと、とたんに継承と実装ができなくなります。importを使うのも手かなと思ったのですが、どうやってjarファイルを指定すればいいのかわかりません。 もともと、ビルドパスはdefault packageにしか、効かないのでしょうか? それから、どのようにpackage aaaはこのjarファイルにあるクラスを実装と継承をするのでしょうか? もともと、パッケージを2つ用意する必要も無いのですが、このプロジェクトの都合上、2つパッケージを用意した方が整理整頓できるのでこの方法を選びました。もし、「んな、うまい話なんかねぇよ!」ってことでしたら、この方法を廃止しざるを得ないのですが、どうにか実現する方法は無いでしょうか?

    • ベストアンサー
    • Java
  • インターフェースの実装で実体が存在しない場合の対処について

    現在作成している部品群のパッケージを新しいパッケージに変更しなければならない ということに取り組んでいます。従来動作していた開発システムを変更することなく、 新しく開発したシステムも動作させたいと思っています。 色々考えてみたのですが行き詰まってしまい、是非お知恵をお貸し願いたいです。 長文ですが、宜しくお願い致します。 -------------------- (1)過去のパッケージのインターフェース   package hoge.hogehoge;   public interface Hoge {     public String getHoge();   } -------------------- (2)新しいパッケージのインターフェース   package new.hoge.hogehoge;   public interface Hoge {     public String getHoge();   } -------------------- (3)(2)に対する新しいパッケージのラッパー   package new.hoge.hogehoge;   public class HogeWrapper implements hoge.hogehoge.Hoge, new.hoge.hogehoge.Hoge {     private String Hoge;     public String getHoge() {       return Hoge;     }     public void setHoge( String data ) {       Hoge = data;     }   } -------------------- 上記はシステム上、(2)と(3)を利用して以下の様な形で 利用しており、Servletのセッションオブジェクトとして保管しています。  HOGE = new HogeWrapper();  HttpSession#setAttribute( HOGE, "HOGE" ); 現在まで複数のシステムは(1)を利用していたのですが、 パッケージ名を変更しなければならない、且つ旧システムでは パッケージ名を変更する事無く利用出来る様にするということで、 (2)を新しく作成、新しいパッケージ名にして(1)と(2)を 実装する様に変更しています。 この構成にしている理由が以下の通りです。  ・今まで作成した古いパッケージを利用したシステムでも   これらの情報に置き換えてきちんと動作させたい。  ・Servletでセッションオブジェクトとして保存されており、   新しいパッケージでも古いパッケージでも同じセッション   オブジェクトを扱う必要がある。    例1)旧システム     <import文>       import hoge.hogehoge;     <利用文>       Hoge HOGE = ( Hoge ) HttpSession#getAttribute( "HOGE" );    例2)新システム     <import文>       import new.hoge.hogehoge;     <利用文>       Hoge HOGE = ( Hoge ) HttpSession#getAttribute( "HOGE" );  ・二重にラッパーを持つと、メンテが発生した際に両方を   行わなければならず、メンテ漏れを発生させたくない。  ・二重に持っても新パッケージのシステムでは旧パッケージを   利用する旨の記載を残せないのが基本のため、動作しない。 上記のままだと、一応はきちんと動作しますが、ここで問題があります。 (1)は古いパッケージということもあり、システムによって 存在したり存在しなかったりする可能性があります。 この場合(3)の実装で存在しないインターフェースを記述して いることがあるためにエラーが発生すると思います。 何か上手く回避する方法や新たな案はないでしょうか? 宜しくお願い致します。

  • パッケージについて

    いつもお世話になってます。今回は異なるパッケージについてお聞きしたいのですが、違うパッケージのクラスを利用するのには、クラスの先頭にpublicをつけ、利用するときはパッケージ名・クラス名とするか、importを使うかしますよね。そこで、違うファイルは違うフォルダに保存してても実行できるのですか?あと、いくらコンパイルしようとしても、シンボル処理できませんと、利用しようとするクラス、パッケージが出てきます。やはり、同じディレクトリ内でないといけないのか、教えてください。

  • java パッケージについて

          [test](ルート)        |    ーーーーーーーーーーーーーーーーーーー    |         |          |         Test.java   DirTestA.java        [testt]                       |                             [testtt]                       |                     DirTestB.java パッケージについてわからないので質問します。 上の図のようにファイルを格納しています。 DirTestA.javaでDirTestB.javaのオブジェクトを作成するのは DirTestB.javaをimportすれば可能ですが 逆にDirTestB.javaでDirTestA.javaのオブジェクトを作成ができません。DirTestA.javaでpackage Test;と定義して DirTestB.javaでimport Test.DirTestA;とインポートしても ./TestT/TestTT/DirTestB.java:2: パッケージ Test は存在しません。 とエラーが出ます。 どうすればオブジェクトを作成できますか?

  • Javaのパッケージについて初歩的な質問です

    Javaのパッケージについて質問です このコードの1番最後のZenhanクラスのdoTogameメソッドを呼び出しているところで, パッケージ化していてimportされていないのに クラス名.メソッド名でエラーなしで処理できるのはなぜですか? 同じパッケージ名だからだですか? mainメソッドでimportしてるからですか?教えてください

  • パッケージ化されたクラスより変数を読む

    パッケージ宣言されたクラスから配列変数を読み出す場合、どのように記述すればいいのでしょうか。 ファイル名 Pack.java パッケージ名 package firstPack; クラス定義 public class Pack {   String [] test = {"あ","い","う","え","お"} } ↑これを、TestPack.java から test の内容を 呼び出す場合。よろしくお願いします。

    • ベストアンサー
    • Java
  • java import文のエラー

    javaのソースで、パッケージをimportして使用するための簡単なサンプルを作成しました。 import文でクラス名まで指定すれば問題ないのですが、*を利用するとコンパイルエラーとなってしまいます。 コンパイル時にクラスパスを指定するのかと思って試してみましたが、やはりエラーでした。 回避方法をご存知の方いらっしゃいましたら、教えていただけますでしょうか。 なお、java/javacは、1.5.0_14を使用しています。 ■ソースコード(1) <C:\Work\Test\PackTest.java> package Test; public class PackTest{   public static void methodA(){     System.out.println("パッケージ成功");   } } ■ソースコード(2) <C:\Work\UsePack.java> import Test.*;     //import Test.PackTest; なら成功 class UsePack{   public static void main(String args[]){     PackTest.methodA();   } } ■エラー例(1) >javac -d . PackTest.java (これは成功) >javac UsePack.java   UsePack.java:5: PackTest にアクセスできません。   クラスファイル .\PackTest.java は不正です。   ファイルにクラス PackTest が含まれていません。   削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。     PackTest.methodA(); ■エラー例(2) >javac -d . PackTest.java (これは成功) >javac -classpath C:\Work\Test UsePack.java   UsePack.java:1: パッケージ Test は存在しません。   import Test.*;   ^   UsePack.java:5: PackTest にアクセスできません。   クラスファイル C:\Work\Test\PackTest.class は不正です。   クラスファイル Test.PackTest に不正なクラスがあります。   削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。      PackTest.methodA();      ^

  • packageについて

    以下のことでどうしてもエラーが出てしまうのですが、 package jp.co.se.app.test.a; public class a1{ //メソッド public void go(){ System.out.println("hoge"); } } package jp.co.se.app.test.b; import jp.co.se.app.test.a.a1; public class main{ public static void main(String [] args){ a1 aa = new a1(); aa.go(); } } a1クラスはもちろんコンパイルできますが、 mainクラスでは、シンボルを解釈できません:a1 と出てしまいます。 c:\jp.co.se.app.test.b>javac -classpath c:\jp main.java なにが原因なんでしょうか? どなたか教えてください!

    • ベストアンサー
    • Java
  • 同一パッケージ内の継承について

    同一パッケージ内で継承したクラス Test2.java をコンパイルすると「シンボルを見つけられません シンボル:クラス Test1」とエラーになります。 --------Test1.java------- package test; public class Test1{ メソッド } ------------------------- --------Test2.java------- package test; public class Test2 extends Test1{ メソッド } ------------------------- Test1.java,Test2.javaとも同一フォルダ(D:\java\test)にあります。 ちなみにカレントディレクトリをD:\java\testにして javac Test2.java でコンパイルしようとしています。 同一パッケージ内のクラスを継承するというのはおかしなことなんでしょうか?また、コンパイルの仕方もあわせてご教示願えれば助かります。 よろしくお願いします。

    • ベストアンサー
    • Java