2011年9月6日火曜日

ZK Database CRUD を EJB3.1で簡素化


  1. 動機
  2. はZKElection がGlassFish3.01 で動作していたものがNetBeans7.0.1内蔵の3.1.1で動作しないことを調査開始したことだった。MySQL をJNDI コネクションプールで接続しているのですが、コネクションプールの名前が探せないと言うエラーが出たのです。
  3. 為になったサイト
  4. JavaDude ( http://javadude.wordpress.com/ )
    このサイトで、"ZK with EJB3.1 running on GlassFish"というタイトルでREMのプラグインを使用し、JavaEE6 のEJB3.1,JPAでEJB,Databaseアクセスを構成し、global JNDI の使用した数少ないサンプルを見せてくれています。
    ここでの改良点は
    ①JavaDude ではEJBを別プロジェクトで作成し、Webプロジェクトにライブラリとして追加していましたが、その必要はなく、最初からJavaEE6のZKプロジェクトとして作成可能なことを確認できました。
    ②JavaDudeではrendererをapply属性で呼んでいましたが、ここではzul コードの中で、forEach を使用して直接オブジェクトの数をループさせるようにしました。
    ③global JNDI を使用してBlockFacade をcall するコードの NetBeans での自動生成する方法がわかりました。

  5. global JNDI で BlockFacade をcall するコードの NetBeans での自動生成
  6. ①空きスペースで右クリック
    ②コードを挿入を選択
    ③エンタープライズBeanを呼び出し
    ④プロジェクトのリストが現れ、プロジェクトを選択するとその中のEJB が現れるので、
    欲しいものを選択する。
    次に自動生成されたコードを示す。
        private BlockFacade lookupBlockFacadeBean() {
    try {
    Context c = new InitialContext();
    return (BlockFacade) c.lookup("java:global/ElectionEJB/BlockFacade!ejb.election.session.BlockFacade");
    } catch (NamingException ne) {
    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
    throw new RuntimeException(ne);
    }
    }

  7. zul file
  8. z スクリプトで Java コードが内蔵されています。
    <?xml version="1.0" encoding="UTF-8"?>

    <zk xmlns="http://www.zkoss.org/2005/zul">
    <div align="center">
    <window border="normal" width="800px" title="ブロック リスト" >
    <div align="left" style="margin-left:30pt;margin-top:10pt;margin-bottom:10pt">
    <zscript>
    import ejb.election.session.BlockFacade;
    import ejb.election.entity.Block;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    Context context;
    BlockFacade blkdao;
    context = new InitialContext();
    blkdao = (BlockFacade) context.lookup("java:global/ElectionEJB/BlockFacade");
    // BlockFacade blkdao = new BlockFacade();
    List allBlocks = blkdao.findAll();


    public void add(){
    Block newBlk = new Block();
    newBlk.setId(Long.parseLong(cd.value.toString()));
    newBlk.setBlock_name(name.value);
    blkdao.create(newBlk);
    //synchronized data with database
    allBlocks = blkdao.findAll();

    //insert a listBlock into the listbox
    Listitem li = new Listitem();
    li.setValue(newBlk);
    li.appendChild(new Listcell(cd.value.toString()));
    li.appendChild(new Listcell(name.value));
    box.appendChild(li);
    }
    void update(){
    //update database
    Block editBlk = (Block)box.selectedItem.value;
    editBlk.setId(Long.parseLong(cd.value.toString()));
    editBlk.setBlock_name(name.value);
    blkdao.edit(editBlk);

    //update listbox
    List children = box.selectedItem.children;
    ((Listcell)children.get(0)).label = cd.value.toString();
    ((Listcell)children.get(1)).label = name.value;
    }
    void delete(){
    blkdao.remove((Block)box.selectedItem.value);
    box.removeItemAt(box.getSelectedIndex());
    cleargb();

    }
    void move(){
    cd.value = (((Block)box.selectedItem.value).getId()).intValue();
    name.value = ((Block)box.selectedItem.value).getBlock_name();
    }
    void cleargb(){
    cd.value = null;
    name.value = null;
    }
    </zscript>
    <listbox id="box" multiple="true" rows="12"
    onSelect="move()">
    <listhead>
    <listheader label="ブロックコード" width="40px" />
    <listheader label="ブロック名" width="200px" />
    </listhead>
    <listitem forEach="${allBlocks}" value="${each}">
    <listcell label="${each.id}" />
    <listcell label="${each.block_name}" />
    </listitem>
    </listbox>
    <groupbox>
    <caption label="選挙区" />
    ブロックコード: <intbox id="cd" cols="1" />
    ブロック名: <textbox id="name" cols="20" />

    <div align="right" style="margin-left:30pt;margin-top:10pt;margin-bottom:10pt">
    <button label="追加" width="50px" height="24px" onClick="add()" />
    <button label="更新" width="50px" height="24px" onClick="update()" />
    <button label="削除" width="50px" height="24px" onClick="delete()" />
    </div>
    </groupbox>
    </div>
    </window>
    </div>
    </zk>



  9. facade コード
  10. abstract facade を拡張します。
    package ejb.election.session;

    import ejb.election.entity.Block;
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;

    @Stateless
    public class BlockFacade extends AbstractFacade {
    @PersistenceContext(unitName = "ElectionEJBPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
    return em;
    }

    public BlockFacade() {
    super(Block.class);
    }

    }

  11. entity コード
  12. 自動生成します。
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    package ejb.election.entity;

    import java.io.Serializable;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;

    /**
    *
    * @author stera
    */
    @Entity
    public class Block implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String block_name;

    public String getBlock_name() {
    return block_name;
    }

    public void setBlock_name(String block_name) {
    this.block_name = block_name;
    }

    public Long getId() {
    return id;
    }

    public void setId(Long id) {
    this.id = id;
    }

    @Override
    public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
    }

    @Override
    public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Block)) {
    return false;
    }
    Block other = (Block) object;
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
    return false;
    }
    return true;
    }

    @Override
    public String toString() {
    return "ejb.election.NewEntity[ id=" + id + " ]";
    }

    }

2009年12月2日水曜日

Google App Engine2 NetBeans で Web開発

NetBeansのプラグインでJavaのみではなく、groovyコードも使用したWebアプリを開発して、Google App Engineに載せたいと思う時があります。
NetBeansでは、Jave SEプロジェクトならば、groovyコードが混在する場合も正常にコンパイルでき、動作します。が、Java EEプロジェクトの場合は混在させると、コンパイル時にgroovyコードのコンパイルが置き去りになり、Javaクラスが生成されません。
NetBeansのJava Webapp プロジェクトマネージャーには"Enable Groovy" 機能がサポートされていないようです。
そこで、次のURLに従って、Web App プロジェクトを修正して「groovy混在」を可能にできました。
"http://stackoverflow.com/questions/416116/groovy-netbeans-and-java-ee"

Java SEプロジェクトとJava Webプロジェクトを比較したとき、Java SEプロジェクトにgroovyコードをGUIを使用して追加すると、nbprojectフォルダにgroovy-build.xmlが生成されることがわかります。
そこでこのファイルをJava Webプロジェクトのnbprojectフォルダにコピーしてやり、build.xmlに次のような修正を加えてやります。





また、groovy-build.xmlそのものも、動作環境の違いを修正してやります。






build-impl.xmlについても


2009年12月1日火曜日

Google App Engine1 NetBeans Plungin

NetBeans IDE で Google App Engineを開発する。
Geertjan's Blogを参考にする。
 URL: http://blogs.sun.com/geertjan/entry/developing_for_google_app_engine

上記のURLからNetBeans support for Google App Engine のサポートページにリンクする。
 URL: http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=18493

ここで、Downloadのボタンを押すと、次のページにリンクする。
このガイドに従い、
  1. プラグイン に行き、設定タブを押す。
  2. 追加ボタンを押し、Update centerの名前を"App Engine"として、下記のURLをテキストフィールドに入れ、了解ボタンを押す。
http://kenai.com/projects/nbappengine/downloads/download/Latest_NetBeans68/updates.xml












  1. 使用可能なプラグインタブに切り替え、 Google App Engine modules (server, configuration, deployment, editor hints)を選択する。
  2. インストールボタンを押す。
すると、次の4つのプラグインがインストールされる。
Google App Engine Editor Hints
Google App Engine Server Ver 1.04 09/10/14
Google App Engine Cofiguration Editor
Google App Engine Samples
Google AppEngine Deployment

このプラグインを使用して、アップロードを試みる。が次のエラーが出る。
Errors
###################################################################
Reading application configuration data...
Beginning server interaction for stera77...
0% Creating staging directory
5% Scanning for jsp files.
8% Compiling jsp files.
11% Compiling java files.

Error Details:
2009/11/17 15:51:56 org.apache.jasper.JspC processFile
情報: Built File: \guestbook.jsp


java.lang.IllegalStateException: cannot find javac executable based on java.home, tried "C:\Program Files\Java\jre6\bin\javac.exe" and "C:\Program Files\Java\bin\javac.exe"
Unable to update app: cannot find javac executable based on java.home, tried "C:\Program Files\Java\jre6\bin\javac.exe" and "C:\Program Files\Java\bin\javac.exe"
Please see the logs [C:\Users\stera\AppData\Local\Temp\appcfg7507442255159722246.log] for further information.
####################################################################

これは、javaのパスが正確に伝わっていない為なので、次のようなパッチを充てる。
Patch to C:\GAE\appengine-java-sdk-1.2.6\bin\appcfg.cmd
@C:\Java\jdk1.6\bin\java -cp "%~dp0\..\lib\appengine-tools-api.jar" com.google.appengine.tools.admin.AppCfg %*


デプロイ後の状況は次のURLで確認する。
Admin Console
http://code.google.com/intl/en/appengine/docs/theadminconsole.html

2009年6月15日月曜日

Metro Basic_Java Basic_WSDLの実践

Metro ではじめよう ≫ Metro の環境での JAX-WS アプリケーションのビルド (Basic)
のJavaからのサンプルをやってみた。
サンプルをC:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava にコピーし、DOSでant server
と入力したところ、"Web container not identified. Require AS_HOME or CATALINA_HOME be set"
と警告されたので、set AS_HOME=C:\Sun\AppServer と環境設定してから、もう一度コマンドを入力すると、ちゃんと実行された。
C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava>ant server
Buildfile: build.xml
Trying to override old definition of task apt
setup:
[mkdir] Created dir: C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava\build
[mkdir] Created dir: C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava\build\classes
[mkdir] Created dir: C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava\build\war
server:
clean:
[delete] Deleting directory C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava\build
setup:
[mkdir] Created dir: C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava\build
[mkdir] Created dir: C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava\build\classes
[mkdir] Created dir: C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava\build\war
build-server-java:
[apt] 警告: プロセッサなしの注釈タイプです: [javax.xml.bind.annotation.Xml
RootElement, javax.xml.bind.annotation.XmlAccessorType, javax.xml.bind.annotation.XmlType, javax.xml.bind.annotation.XmlElement]
[apt] 警告 1 個
create-war:
[war] Building war: C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava\build\war\wsit-jaxws-fromjava.war
deploy:
[copy] Copying 1 file to C:\Sun\AppServer\domains\domain1\autodeploy
BUILD SUCCESSFUL
今のコマンドで、デプロイまで実行されてしまっている。
デプロイコマンドを投入しても実質的には何も変わらない。
C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava>ant deploy
Buildfile: build.xml
Trying to override old definition of task apt
deploy:
BUILD SUCCESSFUL
このコマンドでAppサーバーが起動される訳ではない。NetBeansからGlassFishを起動して、起動時のログで先ほどautodeployディレクトリに置かれたwarが実際にデプロイされたことを確認できる。
*************
アプリケーションサーバーの起動は完了しました。
[AutoDeploy] 自動配備の対象としてファイル C:\Sun\AppServer\domains\domain1\autodeploy\wsit-jaxws-fromjava.war を選択します。
deployed with moduleid = wsit-jaxws-fromjava
WSSERVLET12: JAX-WS コンテキストリスナーを初期化しています
WSSERVLET14: JAX-WS サーブレットを初期化しています
[AutoDeploy] 自動配備は正常に実行されました : C:\Sun\AppServer\domains\domain1\autodeploy\wsit-jaxws-fromjava.war。
*************
ブラウザで配備が成功したことを確認する。
http://localhost:8080/wsit-jaxws-fromjava/addnumbers?wsdl
のURLでブラウザのページいっぱいにXMLが表示されることを確認できます。これはwsdl.xmlです。
今度はJAX-WS Web サービスクライアントのビルドです。
C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava>ant client
Buildfile: build.xml
Trying to override old definition of task apt
setup:
generate-client:
[wsimport] Consider using / so that wsimport won't do unnece
ssary compilation
[wsimport] parsing WSDL...
[wsimport]
[wsimport]
[wsimport] generating code...
[wsimport]
[wsimport]
[wsimport] compiling code...
[wsimport]
client:
[javac] Compiling 1 source file to C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws
-fromjava\build\classes
BUILD SUCCESSFUL
今度は Web サービスクライアントの実行です。
C:\AnetBeans6.7RC2\Metro\Meloc\wsit-jaxws-fromjava>ant run
Buildfile: build.xml
Trying to override old definition of task apt
run:
[java] Invoking addNumbers(10, 20)
[java] The result of adding 10 and 20 is 30.
[java]
[java] Invoking addNumbers(-10, 20)
[java] Caught AddNumbersException_Exception: Numbers: -10, 20
BUILD SUCCESSFUL

Metro ではじめよう ≫ Metro の環境での JAX-WS アプリケーションのビルド (Basic)
のWSDlからのサンプルもやってみた。
殆ど同様の手順とログで出来た。

2009年6月3日水曜日

Avast ライセンスキー の更新

1.Windows 右下のAvast アイコンを確認。






2.Avast アイコンの上にマウスカーソルを重ね、右クリックする。

















3.そして、マウスカーソルを"Avastについて"まで移動する。
そしてクリックする。















4.現れた窓のライセンスキーと書かれているボタンをクリックする。
「ライセンスキーを入力してください」と書かれている所に、メールで渡しましたライセンスキーを入力す
る。










5.下記のような画面が現れたら、成功です。

2009年5月13日水曜日

NetBeansでGrailsプロジェクト

http://rem1.sourceforge.net/jp/index.html のページでチュートリアルを選択して、
Guide to zkgrails(ZK plugin for Grails)に入ります。
ここの解説はコマンド行で実施するチュートリアルですが、NetBeansに置き換えて説明します。

まず最初にGrails1.1を入手して、Windowsにインストールします。
次に ツール > オプション > その他 > Grooby で 
Grails のホーム に先にインストールしたGrails1.1のインストール先を指定します。

$ grails create-app ondemand   の所は
新規プロジェクト> Groovy > Grails アプリケーション
次へ > プロジェクト名 に"ondemand" と入力 > 完了
の手順でGrailsプロジェクトを作成します。

するとNetBeans出力の(create0app)欄には次の表示が出ます。
Welcome to Grails 1.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: C:\grails-1.1

Base Directory: C:\ANetBeans6.7\grails
Running script C:\grails-1.1\scripts\CreateApp_.groovy
Environment set to development
Setting non-interactive mode
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\src
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\src\java
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\src\groovy
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\controllers
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\services
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\domain
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\taglib
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\utils
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\views
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\views\layouts
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\i18n
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\conf
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\test
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\test\unit
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\test\integration
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\scripts
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\web-app
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\web-app\js
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\web-app\css
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\web-app\images
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\web-app\META-INF
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\lib
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\conf\spring
[mkdir] Created dir: C:\ANetBeans6.7\grails\ondemand\grails-app\conf\hibernate
[propertyfile] Creating new property file: C:\ANetBeans6.7\grails\ondemand\application.properties
[copy] Copying 1 resource to C:\ANetBeans6.7\grails\ondemand
[unjar] Expanding: C:\ANetBeans6.7\grails\ondemand\grails-shared-files.jar into C:\ANetBeans6.7\grails\ondemand
[delete] Deleting: C:\ANetBeans6.7\grails\ondemand\grails-shared-files.jar
[copy] Copying 1 resource to C:\ANetBeans6.7\grails\ondemand
[unjar] Expanding: C:\ANetBeans6.7\grails\ondemand\grails-app-files.jar into C:\ANetBeans6.7\grails\ondemand
[delete] Deleting: C:\ANetBeans6.7\grails\ondemand\grails-app-files.jar
[move] Moving 1 file to C:\ANetBeans6.7\grails\ondemand
[move] Moving 1 file to C:\ANetBeans6.7\grails\ondemand
[move] Moving 1 file to C:\ANetBeans6.7\grails\ondemand
Installing plug-in hibernate-1.1
[mkdir] Created dir: C:\Documents and Settings\stera\.grails\1.1\projects\ondemand\plugins\hibernate-1.1
[unzip] Expanding: C:\Documents and Settings\stera\.grails\1.1\plugins\grails-hibernate-1.1.zip into C:\Documents and Settings\stera\.grails\1.1\projects\ondemand\plugins\hibernate-1.1
Executing hibernate-1.1 plugin post-install script ...
Plugin hibernate-1.1 installed
Created Grails Application at C:\ANetBeans6.7\grails/ondemand

ターゲットになっているのは次のコマンド行を実行するところです。
$ grails install-plugin zk
プロジェクトを選択 > 右クリック > Grails コマンドを実行
で現在のプロジェクトで実行できるコマンドスクリプトの一覧が出ますので、
このWindowでinstall-pluginを選択して、パラメータにzkと入力して実行します。
するとNetBeans出力のondemand(install-plugin)欄には次の表示が出ます。
Welcome to Grails 1.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: C:\grails-1.1

Base Directory: C:\ANetBeans6.7\grails\ondemand
Running script C:\grails-1.1\scripts\InstallPlugin.groovy
Environment set to development
Reading remote plugin list ...
Reading remote plugin list ...
Plugin list out-of-date, retrieving..
[delete] Deleting: C:\Documents and Settings\stera\.grails\1.1\plugins-list-default.xml
[get] Getting: http://plugins.grails.org/.plugin-meta/plugins-list.xml
[get] To: C:\Documents and Settings\stera\.grails\1.1\plugins-list-default.xml
..........
[get] last modified = Tue May 12 23:14:10 JST 2009
[get] Getting: http://plugins.grails.org/grails-zk/tags/RELEASE_0_7_1/grails-zk-0.7.1.zip
[get] To: C:\Documents and Settings\stera\.grails\1.1\plugins\grails-zk-0.7.1.zip
..................................................................................................................................................................
[get] last modified = Sun Mar 22 07:57:14 JST 2009
[copy] Copying 1 file to C:\Documents and Settings\stera\.grails\1.1\projects\ondemand\plugins
Installing plug-in zk-0.7.1
[mkdir] Created dir: C:\Documents and Settings\stera\.grails\1.1\projects\ondemand\plugins\zk-0.7.1
[unzip] Expanding: C:\Documents and Settings\stera\.grails\1.1\plugins\grails-zk-0.7.1.zip into C:\Documents and Settings\stera\.grails\1.1\projects\ondemand\plugins\zk-0.7.1
Executing zk-0.7.1 plugin post-install script ...
[copy] Copying 1 file to C:\ANetBeans6.7\grails\ondemand\web-app\WEB-INF
Plugin zk-0.7.1 installed
Plug-in provides the following new scripts:
------------------------------------------
grails create-composer
grails create-zul

ここで最後の2行に見えるものがプロジェクトに追加されたコマンドスクリプトで、
先ほどの
プロジェクトを選択 > 右クリック > Grails コマンドを実行
で現在のプロジェクトで実行できるコマンドスクリプトの一覧が更新して出るはずですが、元のままです。
ここでプロジェクトを閉じて、もう一度オープンしても元のままです。
といいたい所ですが、我が家ではちゃんとリフレッシュされて、
create-composer も create-zul も見えました。

我社内でやっていた時は、NetBeansの再立ち上げで初めて、追加されて見えたのに、
動作が違う・・・・・?
我が家のパソコンの方が早いので旨く行くのかな?

2009年5月5日火曜日

Java VisualVM と TASKKILLを使ってJettyを停止する。

我々NetBeans愛好家にとって、アプリケーションサーバーはGlassFishですが、アプリケーションによってはJettyを使用しているものが多い。
最近話題のGrailsやGoogleApplicationEngineもその例であり、Red5も使用しています。
IDEとしてNetBeansを使用して、GrailsやGoogleApplicationEngine応用の開発を試みたときにJettyに関わる困難に遭遇します。
それはNetBeans上において、JettyはGlassFishやTomcatと違って思うような操作が出来ないことです。
Jettyのステータスが確認できないことも困りますが、特に困ることはJettyが起動したままで、停止できないことです。
一度アプリケーションを試した後に、次のバリエーションを確認しようとすると「既にJettyが起動中でポートを占有しているのでこれ以上進展できません」というメッセージが出ることが度々あります。
こんなときはパソコンをリブートすれば解決するのですが、こんなことをイチイチやっていては時間がどれだけ有っても足りませんし、テンポが悪くて能率が悪くなってしまいます。
こんな時に役に立つのがタイトルに有った「Java VisualVM と TASKKILLを使ってJettyを停止する。」というアイデアでした。ふとJava VisualVMの利用を思いつき、起動中のJettyのプロセス番号を知ることが出来ることが確認できました。











このようにGAEでサンプルを起動したときに、Java VisualVMでそのときのプロセスを確認できます。
サンプルをDOSで起動したときにおいても、コントロール/CでバッチをストップできますがJettyのプロセスが残ることが多いのです。

そこで探したのがWindows上でもプロセス番号を使用してプロセスを停止するコマンドがないか探しましたら、ありました。"TASKKILL"です。
使用法:
   Tasklistで検索したプロセスID1230を終了する
   taskkill /pid 1230
そうしてやってみましたら、我社内の環境では旨くいったのに我が家ではダメでした。何故か?
これは我が家のパソコンはWindows HOME Editionでした。そこで探したのがこれ。
http://www.vector.co.jp/soft/winnt/util/se401845.html
ところが、これだけでは起動できません。
このアプリケーションはMicrosoft .NET Framework Version 2.0に依存していました。
これで万全と思いきや、このフリーウエアは不完全でした。killできないものがありました。
com.google.appengine.tools.development.DevAppServerMain
のプロセスがkillできないのです。
Windows Professionalからコピーしてくるのが最良であることが分かりました。
これで旨く行きました。