创建 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)的主要内容,如果未能解决你的问题,请参考以下文章