読者です 読者をやめる 読者になる 読者になる

備忘録

物忘れが酷いので

WindowsでJavaの旧バージョンを使う

やり方

コマンド・プロンプトで入っているJavaを調べます.

where java
C:\ProgramData\Oracle\Java\javapath\java.exe
C:\Windows\System32\java.exe
C:\Program Files\Java\jdk1.7.0_67\bin\java.exe

これは環境変数のpathの順番に従っているようです。
そこで、目的のバージョンのパスを先頭に持ってきます
すると、

where java
C:\Program Files\Java\jdk1.7.0_67\bin\java.exe
C:\ProgramData\Oracle\Java\javapath\java.exe
C:\Windows\System32\java.exe

java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

環境変数を消す等危険なことはしなくても良いようです。

環境変数を弄るときはRapid EE(Environment Editor)を使うと便利です。
上の操作もドラッグ・アンド・ドロップでできます。

slim3でmavenを使うときのエラー

[ERROR] Failed to execute goal org.codehaus.mojo:apt-maven-plugin:1.0-alpha-3:process (default) on project mavensample1:
 Execution default of goal org.codehaus.mojo:apt-maven-plugin:1.0-alpha-3:process failed: An API incompatibility was enc
ountered while executing org.codehaus.mojo:apt-maven-plugin:1.0-alpha-3:process: java.lang.VerifyError: Expecting a stac
kmap frame at branch target 17

このようなエラーが発生します。
そこで、pom.xmlのapt-maven-pluginのバージョンを変更します

前
<version>1.0-alpha-3</version>
後
<version>1.0-alpha-5</version>

Google AppEngineが対応していないのであまり関係ありませんがjava8ではtoolsのaptが削除されているためmaven(3.2.3現在)は使えないようです。

Mavenの導入(Windows)

事前準備

JDKオラクルのページからインストールします

次に、PathとJAVA_HOMEを設定します。

Path
C:¥Program Files¥Java¥jdk1.8.0_05\bin
JAVA_HOME
C:¥Program Files¥Java¥jdk1.8.0_05


こんなかんじです。
環境変数を弄るのはWindowsの操作で辛い部分でもあるのでRapidEEを使うと便利です。

Mavenの導入

Mavenこのページからダウンロードします。(binary zip)
あとは適当な場所に解凍してPathを通します

Path
C:\bin\apache-maven-3.2.3¥bin

こんなかんじです。
あとはコマンドラインでインストールできたことを確認します

C:\Users\hoge>mvn --version
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-12T05:58:1
0+09:00)
Maven home: C:\bin\apache-maven-3.2.3
Java version: 1.8.0_05, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jde1.8.0_05\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"

確認できました。

Google AppEngineで実行時にNoClassDefErrorが出た時の対処法

GAE Java Google AppEngine

実行環境

Windows 8
Eclipse 4.3
AppEngine SDK 1.9.8

エラー内容

java.lang.NoClassDefFoundError: javax.servlet.FilterConfig is a restricted class. Please see the Google App Engine developer's guide for more details.
at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
at org.slim3.controller.HotReloadingFilter.initServletContext(HotReloadingFilter.java:95)
at org.slim3.controller.HotReloadingFilter.init(HotReloadingFilter.java:82)
at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:662)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:255)
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:288)
at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java:87)
at com.google.appengine.tools.development.Modules.startup(Modules.java:105)
at com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:258)
at com.google.appengine.tools.development.DevAppServerImpl.access$000(DevAppServerImpl.java:47)
at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:213)
at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:211)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:211)
at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:277)
at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
at com.google.appengine.tools.development.DevAppServerMain.run(DevAppServerMain.java:219)
at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:210)



対処法

OracleからJava SDK 1.7*をダウンロードして、インストール
eclipseのビルドパスの構成を開く
・ライブラリーを開く
・ライブラリーの追加を選ぶ
JRE システムライブラリを選ぶ
・インストール済みのJREを選ぶ
・検索を選び、インストールしたJDKを選択
(例:jdk1.7.0_67)
これでデフォルトのJREJDKのものになり、ビルドできるようになる

Eclipseを更新、または、新規ソフトウェアのインストールをすると型を解決できなくなる

この行に複数マーカーがあります
	- ServletException を型に解決できません
	- FilterChain を型に解決できません

このように表示されますが、これはAppEngineのSDKが更新され、
新しいものに置き換わったために生じます。

解決法は、
ウィンドウ->設定->Google->Appエンジン
と移動し、新しいSDKを登録します。

エラーまみれになって焦った割には、大した問題ではありませんでした。

Blobstoreにファイルをアップロードすると java.lang.IllegalStateException: Must call one of set*BlobStorage() first.が発生する

同じコントローラの中で、今回アップロードしたファイルでないブロブファイルを操作したら
このエラーが発生しました。
http://appenginejava.googlecode.com/svn/trunk/src/com/google/appengine/api/blobstore/dev/BlobStorageFactory.java
にあるようなソースコードを読んでも原因がわからなかったので、
他のファイルの操作をタスクキューに移し、サーバを再起動したら発生しなくなりました。

この解決法が正しいのか、正しくないのかはわかりません。
もし、本当の原因や解決法がわかったら教えていただけると嬉しいです。

html5の<input type="date">をjava.util.Dateに変換する

まず、Date(String s)というコンストラクタを使ってやってみましたが、非推奨ということで
他の方法を探します。
すると、java.text.DateFromat(String s)というのを使って簡単にできることがわかりました。

import java.text.DateFormat;
import java.util.Date;
...

  DateFormat df = new DateFormat("yyyy-MM-dd");
  Date d = df.parse((String)request.getAttribute("date"));
...

非常に簡単です。