创建 GCM 演示应用程序时出现 Javac 错误(Google App Engine Java/Windows 7)

Posted

技术标签:

【中文标题】创建 GCM 演示应用程序时出现 Javac 错误(Google App Engine Java/Windows 7)【英文标题】:Javac error when creating GCM demo app (Google App Engine Java/Windows 7) 【发布时间】:2013-05-29 13:21:06 【问题描述】:

我正在尝试按照“官方”教程 (http://developer.android.com/google/gcm/demo.html) 在 Windows 7 上创建适用于 Android 的 GCM 演示应用程序。

特别是,我正在尝试按照上述教程中的说明使用 Java App Engine 创建服务器:

使用标准 App Engine for Java 设置服务器:

    从 SDK 管理器中,安装 Extras > Google Cloud Messaging for Android Library。这会在下面创建一个 gcm 目录 YOUR_SDK_ROOT/extras/google/ 包含这些子目录: gcm-client, gcm-server, samples/gcm-demo-client, samples/gcm-demo-server 和 samples/gcm-demo-appengine。

    在文本编辑器中,编辑 samples/gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java 并将现有文本替换为上面获得的 API 密钥。

    注意:在该类中设置的 API 键值仅用于在 App Engine 上创建持久实体一次。如果您部署 应用程序,您可以使用 App Engine 的 Datastore Viewer 来更改它 稍后。

    在 shell 窗口中,转到 samples/gcm-demo-appengine 目录。

    通过 ant runserver 启动开发 App Engine 服务器,使用 -Dsdk.dir 指示 App Engine SDK 的位置,使用 -Dserver.host 设置服务器的主机名或 IP 地址:

    $ ant -Dsdk.dir=/opt/google/appengine-java-sdk runserver -Dserver.host=192.168.1.10 构建文件:gcm-demo-appengine/build.xml

我已按照这些步骤操作,但出现以下错误:

C:\Users\p\AppData\Local\Android\android-sdk\extras\google\gcm\samples\gcm-demo-appengine>ant -Dsdk.dir C:/Users/p/appengine-java-sdk-1.8.0 runserver -Dserver.host=192.168.44.1 Buildfile: gcm-demo-appengine/build.xml
Buildfile: C:\Users\p\AppData\Local\Android\android-sdk\extras\google\gcm\samples\gcm-demo-appengine\build.xml

init:

copyjars:

compile:
    [javac] Compiling 8 source files to C:\Users\p\AppData\Local\Android\android-sdk\extras\google\gcm\samples\gcm-demo-appengine\WebContent\WEB-INF\classes
    [javac] C:\Users\p\AppData\Local\Android\android-sdk\extras\google\gcm\samples\gcm-demo-appengine\src\com\google\android\gcm\demo\serer\ApiKeyInitializer.java:1: reached end of file while parsing
    [javac] AIzbSyBQdFestseFygh7Q22dxEfdsyc_k->
    [javac] ^
    [javac] 1 error

BUILD FAILED

解析时到达文件末尾” - 据我了解,此错误通常是由缺少括号引起的 - 但是,我所做的只是在记事本中编辑 ApiKeyInitializer.java 文件以输入 API 密钥;我没有碰任何代码!我已经尝试在网上找到解决方案,但无济于事。

有谁知道可能导致此问题的原因以及我该如何解决?非常感谢!

【问题讨论】:

请附上ApiKeyInitializer.java的代码。您在输入 API 密钥时一定做错了什么。 嗨,Eran,非常感谢您的回复。文件 ApiKeyInitializer.java 不包含任何代码 - 它实际上只包含密钥(参见教程中引用的文本中的 (2)) - 这正是让我感到困惑的地方...... 如果它只包含密钥,它不是一个有效的java文件,你不应该尝试编译它(它不应该使用.java后缀)。 谢谢,Eran,你写的很有意义。问题是我不知道如何更改后缀 - 我只是按照 Android 开发人员教程中建议的步骤进行操作。我开始怀疑是否有人让这个教程工作?!? 在下面查看我的答案。 ApiKeyInitializer.java 似乎是一个有效的 java 文件。也许你以某种方式删除了它的内容。 【参考方案1】:

我检查了 ApiKeyInitializer.java 文件(我在本地计算机上拥有它)。 它看起来像一个有效的 java 类:

/*
 * Copyright 2012 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.google.android.gcm.demo.server;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

import java.util.logging.Logger;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * Context initializer that loads the API key from the App Engine datastore.
 */
public class ApiKeyInitializer implements ServletContextListener 

  static final String ATTRIBUTE_ACCESS_KEY = "apiKey";

  private static final String ENTITY_KIND = "Settings";
  private static final String ENTITY_KEY = "MyKey";
  private static final String ACCESS_KEY_FIELD = "ApiKey";

  private final Logger logger = Logger.getLogger(getClass().getName());

  public void contextInitialized(ServletContextEvent event) 
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Key key = KeyFactory.createKey(ENTITY_KIND, ENTITY_KEY);

    Entity entity;
    try 
      entity = datastore.get(key);
     catch (EntityNotFoundException e) 
      entity = new Entity(key);
      // NOTE: it's not possible to change entities in the local server, so
      // it will be necessary to hardcode the API key below if you are running
      // it locally.
      entity.setProperty(ACCESS_KEY_FIELD,
          "replace_this_text_by_your_Simple_API_Access_key");
      datastore.put(entity);
      logger.severe("Created fake key. Please go to App Engine admin "
          + "console, change its value to your API Key (the entity "
          + "type is '" + ENTITY_KIND + "' and its field to be changed is '"
          + ACCESS_KEY_FIELD + "'), then restart the server!");
    
    String accessKey = (String) entity.getProperty(ACCESS_KEY_FIELD);
    event.getServletContext().setAttribute(ATTRIBUTE_ACCESS_KEY, accessKey);
  

  public void contextDestroyed(ServletContextEvent event) 
  


也许您以某种方式删除了该文件的内容。

【讨论】:

太棒了,谢谢!现在似乎可以编译了,并通知我“Dev App Server 正在运行”。我很惊讶我不必在某处输入 API 密钥?!? 我认为你应该在上面写着的地方输入你的 API 密钥:"replace_this_text_by_your_Simple_API_Access_key" 当然!我忽略了这一点,我太傻了。非常感谢您的时间和耐心!

以上是关于创建 GCM 演示应用程序时出现 Javac 错误(Google App Engine Java/Windows 7)的主要内容,如果未能解决你的问题,请参考以下文章

GCM 注册时出现 INVALID_SENDER 错误

在 GCM 中发送推送通知时出现未经授权的错误

接收 GCM 时出现错误消息

编译JAVA程序成功但运行javac命令时出现错误

编译JAVA程序成功但运行javac命令时出现错误

从未调用 gcm.unregister() 时出现意外的 gcm 未注册消息