ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2018/08/30

[Java] Google App Engine で自作のJarライブラリを読み込ませる

はじめに

eclipseで自作jarライブラリをビルドパスに登録すると問題なくコンパイルされる。
ただGAEにデプロイすると「NoClassDefFoundError」と自作jarのクラスが見つからないという例外が発生する。

その対処法を調べたのでここにまとめる。
※他にもっと効率のいい方法があると思います。

手順

  1. 自作jarファイルをGAEにデプロイするプロジェクトのフォルダの「(GAEプロジェクト)/src/main/webapp/WEB-INF/lib/」フォルダへコピー
  2. eclipseを起動し、下記のように自作jarまで開く
  3. jarを右クリック -> ビルド・パス -> ビルド・パスに追加 をクリック
  4. これでGAEへデプロイしても問題なく動作するはず







[Java] Google App Engine で「No handlers matched this URL.」が出る

開発中突然、GAEにデプロイしたアプリが @webservlet で指定したURLを認識せず、404 not found を返すようになったので、その対処法メモ。

状況

  • デプロイ時にはエラーなどは出ない
  • htmlなどの静的ファイルにはアクセスできる
  • @webservlet で指定したURLにアクセスしても「404 not found」が返り。
  • Google Stackdriver Loggingのアクセスログを見ても「No handlers matched this URL.」のみでJavaのエラーが出ているわけではない。
    • 挙動的には@webservlet で指定したURLを読み取っていないイメージ
  • 別のプロジェクトを用意し、GAEにデプロイすると問題なく動作する。
    • eclipseのプロジェクトの設定が原因?

対処法

問題が出るプロジェクトのフォルダを見ると、「src」「target」「.setting (隠しフォルダ)」の他に正常なプロジェクトには存在しない「bin」というフォルダがあった。

binフォルダを別の場所に移動したところ、上記の問題が発生しなくなった。

binフォルダが悪さをしていたのが原因

以上




2018/02/23

[Java 8] JSPファイルをGoogle App Engineにデプロイできない

Google App Engine (GAE) にJava Server Pages (JSP)ファイル込みのコードをデプロイ(アップロード)しようとすると、エラーが出て失敗するためその対処法メモ。

2018/01/29

[Java] Google App Engine で管理者用ページを作る

Google App Engine でデータ登録などに使用する管理者用ページを作る

環境

  • Google App Engine Standard
  • Cloud Tools for Eclipse
  • Java 8

web.xmlの設定

webapp/WEB-INF/web.xml に以下の項目を追記する
<security-constraint>
  <web-resource-collection>
    <web-resource-name>admin</web-resource-name>
    <url-pattern>/admin/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>admin</role-name>
  </auth-constraint>
</security-constraint>

url-patternで管理者アカウントが必要なページを指定。
この場合は /admin/ 以下のページ全てが対象

role-nameを*にするとGoogleアカウントを持っている人すべてがログインできる。

管理者の設定

管理者の設定はGoogle Cloud Console の「IAMと管理 -> IAM」から設定

projectを作成したオーナーはApp Engineの管理者権限がデフォルトで割り当てられているので追加の設定は無し


別のアカウントログインできるようにするには「追加」から以下の図のように「App Engine -> App Engine 管理者」で別アカウントのGmailのアドレスを入力して権限を与えること


アクセス

App Engine にデプロイしてから対応するページにアクセスすると以下の図のようなログイン画面が表示される


管理者アカウントだとhtml、jspページが表示される。

許可のないアカウントだと 403 Forbidden 「Error: Forbidden」が表示される

参考

web.xml による認証の設定、管理者の指定 - Google App Engine 入門

2018/01/21

[Java] Google Cloud ライブラリで例外 NoSuchMethodError が発生する問題

Google Cloud StorageのJavaライブラリを使用した時に、以下の例外が発生した際の対処法メモ

発生した例外
Caused by: java.lang.NoSuchMethodError: com.google.api.gax.core.GaxProperties.getLibraryVersion(Ljava/lang/Class;)Ljava/lang/String

MavenでCloud StorageとCloud Loggingを入れていると実行時に例外が発生する

入れていたライブラリとバージョン
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>1.15.0</version>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-logging</artifactId>
<version>1.15.0</version>

調べてみるとStorageとLoggingで使用しているgaxというライブラリのバージョンが異なっており、それが原因でエラーが発生したようだ。

仮対処として使用していないLoggingのライブラリを削除した所、例外は発生しなくなった。


参考
java.lang.ClassNotFoundException: com.google.api.gax.rpc.ClientSettings when using Firestore
https://github.com/GoogleCloudPlatform/google-cloud-java/issues/2496

2017/10/14

StatusRuntimeException UNAVAILABLE の例外対処

Google Cloud Platform の Cloud Pub/Sub をJavaで動かそうとしたら、例外が出て動かなかった。以下にその対処法を書きます

使用したライブラリ
Google Cloud Java Client for Pub/Sub
https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-pubsub

発生した例外

Exception in thread "main" java.util.concurrent.ExecutionException: io.grpc.StatusRuntimeException: UNAVAILABLE
        at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:500)
        at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:479)
        at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:76)
        at com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:62)
        at rkserver.BoincBigDataMain.publishMessages(BoincBigDataMain.java:51)
        at rkserver.BoincBigDataMain.main(BoincBigDataMain.java:77)
Caused by: io.grpc.StatusRuntimeException: UNAVAILABLE
        at io.grpc.Status.asRuntimeException(Status.java:526)
        at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:433)
        at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:422)
        at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:61)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:504)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:425)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:536)
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:102)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javax.net.ssl.SSLHandshakeException: General OpenSslEngine problem
        at io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier.verify(ReferenceCountedOpenSslContext.java:647)
        at io.netty.internal.tcnative.SSL.readFromSSL(Native Method)
        at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.readPlaintextData(ReferenceCountedOpenSslEngine.java:481)
        at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1019)
        at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1126)
        at io.netty.handler.ssl.SslHandler$SslEngineType$1.unwrap(SslHandler.java:210)
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1215)
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1127)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1162)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1342)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:934)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
        at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
        ... 1 more
Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: algorithm constraints check failed
        at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:352)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:249)
        at sun.security.validator.Validator.validate(Validator.java:260)
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:281)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136)
        at io.netty.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback.verify(ReferenceCountedOpenSslClientContext.java:221)
        at io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier.verify(ReferenceCountedOpenSslContext.java:643)
        ... 26 more
Caused by: java.security.cert.CertPathValidatorException: algorithm constraints check failed
        at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:135)
        at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:219)
        at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:140)
        at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:79)
        at java.security.cert.CertPathValidator.validate(CertPathValidator.java:292)
        at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:347)
        ... 33 more


環境

開発環境と実行環境は別です

開発環境
Windows 7 64bit
eclipse 4.6.1
com.google.cloud  google-cloud-pubsub  0.25.0-beta
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

実行環境
CentOS 7
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)


原因と対処法

実はWindowsのJava(TM) SE Runtime Environment環境だと問題なく動く。
CentOS 7のOpenJDK環境でのみエラーが発生する。

yum update java を実行してOpenJDKをアップデート

アップデート後のopenJDK
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)

OpenJDKをアップデートしたところ、エラーが出なくなった。

結論

ソフトウェアは最新の状態にしましょう