{"id":893,"date":"2012-02-23T16:16:00","date_gmt":"2012-02-23T16:16:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/google-appengine-staging-server-howto.html"},"modified":"2012-10-21T22:56:29","modified_gmt":"2012-10-21T22:56:29","slug":"google-appengine-staging-server-howto","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html","title":{"rendered":"Google Appengine Staging Server Howto"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">Out of the box, Google\u2019s App Engine supports versioned deployments. You can switch back and forth between revisions very easily, which is a great feature for properly testing an application before going live. There is one major problem: All versions of the application share the same datastore. So if you\u2019re migrating your data you run a serious risk of influencing your current production application. Hence the need for a <strong>proper staging environment.<\/strong><\/p>\n<p>It\u2019s no secret, I am a fan of Google\u2019s App Engine. <a href=\"http:\/\/www.streamhead.com\/google-appengine-practice\/\">Once you get used to its peculiarities, it has a number of major advantageous<\/a>. Since I started incorporating some of the continuous integration\/lean startup ideas <a href=\"http:\/\/www.streamhead.com\/launching-my-first-vaadin-appengine-project\/\">in my own project<\/a>. I\u2019ve run into the shared datastore issue and the need for a properly isolated staging environment has become apparent.<\/p>\n<p>Here\u2019s how I did it.<\/p>\n<p><strong><span class=\"Apple-style-span\" style=\"font-size: large\">Setting up the Staging Application<\/span><\/strong><\/p>\n<p>It\u2019s possible to use namespaces to create an isolated datastore, however I didn\u2019t want to create additional code for testing. So I took another approach, which I believe is a lot easier and less error-prone:<\/p>\n<ol style=\"text-align: left\">\n<li>In the appengine control panel, create a second application. You have 10 free ones so that shouldn\u2019t be a problem. I added the \u201c-staging\u201d suffix to the name of the application under test, so I won\u2019t mistake one for the other.<\/li>\n<li>If you want to start from a copy of the existing datastore, you can<a href=\"http:\/\/code.google.com\/appengine\/docs\/python\/tools\/uploadingdata.html\"> export the entire datastore using the Python development kit<\/a>. Even if you\u2019re using the Java development kit, it\u2019s worth setting this up. It allows you to make backups of your datastore, which might come in handy when something is really messed up.<\/li>\n<li>Next, import the database into your staging application using the same tool.<\/li>\n<li>And finally, deploy your application to the staging application. If you\u2019re using Eclipse, just change the application id, if not, you can find the property in the appengine-web.xml.<\/li>\n<\/ol>\n<p>A small note on using production data in your tests: Be very careful about it. You may want to anonymize some of the data and remove anything that could be remotely confidential.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>That should be it. There really wasn\u2019t much to it, but you now should have a fully functioning copy of your production application. Surf around a little to make sure everything is working swiftly.<\/p>\n<p>When you\u2019re happy, lets automate it.<\/p>\n<p><strong><span class=\"Apple-style-span\" style=\"font-size: large\">Automating Deployments<\/span><\/strong><\/p>\n<p><a href=\"http:\/\/www.streamhead.com\/maven-alternatives\/\">I was about to throw out Maven<\/a>, but I\u2019ve now created a setup that I\u2019m pretty happy with. So Maven is here to stay for now. As are the Maven Eclipse plugin and the <a href=\"http:\/\/www.streamhead.com\/maven-alternatives\/\">GAE plugin for Maven<\/a>.<\/p>\n<p>It\u2019s thanks to the maven-gae-plugin that I could automate the staging and production deployments. Which has given me a very reproducible build and deployment set up.<\/p>\n<p>To seamlessly create a build for both the staging and production server, I\u2019m using Maven profiles and its ability to <a href=\"http:\/\/maven.apache.org\/plugins\/maven-resources-plugin\/examples\/filter.html\">filter resources while copying them<\/a>.<\/p>\n<p>In the appengine-web.xml I added a gae.application variable:<\/p>\n<pre class=\"brush: xml;\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;appengine-web-app xmlns=\"http:\/\/appengine.google.com\/ns\/1.0\"&gt;\r\n        &lt;application&gt;${gae.application}&lt;\/application&gt;\r\n...\r\n<\/pre>\n<p>Next up I enabled filtering of the appengine-web.xml (all of the next few bits go into the pom.xml):<\/p>\n<pre class=\"brush: xml;\">&lt;plugin&gt;\r\n    &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;maven-war-plugin&lt;\/artifactId&gt;\r\n    &lt;configuration&gt;\r\n        &lt;webResources&gt;\r\n            &lt;resource&gt;\r\n                &lt;directory&gt;src\/main\/webapp&lt;\/directory&gt;\r\n                &lt;filtering&gt;true&lt;\/filtering&gt;\r\n                &lt;includes&gt;\r\n                    &lt;include&gt;**\/appengine-web.xml&lt;\/include&gt;\r\n                &lt;\/includes&gt;\r\n            &lt;\/resource&gt;\r\n        &lt;\/webResources&gt;\r\n    &lt;\/configuration&gt;\r\n&lt;\/plugin&gt;\r\n<\/pre>\n<p>In the properties section, I added the default application, which is the staging one. This gives me the assurance that I\u2019ll always be deploying to the staging environment, unless I really want to go to production:<\/p>\n<pre class=\"brush: xml;\">&lt;properties&gt;\r\n    &lt;gae.application&gt;myapp-staging&lt;\/gae.application&gt;\r\n&lt;\/properties&gt;\r\n<\/pre>\n<p>And for the production deployment I created a profile:<\/p>\n<pre class=\"brush: xml;\">&lt;profiles&gt;\r\n    &lt;profile&gt;\r\n            &lt;id&gt;production&lt;\/id&gt;\r\n            &lt;properties&gt;\r\n                    &lt;gae.application&gt;myapp&lt;\/gae.application&gt;\r\n            &lt;\/properties&gt;\r\n    &lt;\/profile&gt;\r\n&lt;\/profiles&gt;\r\n<\/pre>\n<p>With this configuration, I can easily run the local development server:<\/p>\n<p><span class=\"Apple-style-span\" style=\"font-family: 'Courier New', Courier, monospace\">&gt; mvn gae:run<\/span><\/p>\n<p>Deploy to the staging server:<\/p>\n<p><span class=\"Apple-style-span\" style=\"font-family: 'Courier New', Courier, monospace\">&gt; mvn gae:deploy<\/span><\/p>\n<p>And when I\u2019m happy, deploy&nbsp;it to the production server:<\/p>\n<p><span class=\"Apple-style-span\" style=\"font-family: 'Courier New', Courier, monospace\">&gt; mvn gae:deploy -Pproduction<\/span><\/p>\n<p>In addition to the name of the application, you can also configure other properties that differ between a test setup and a production one. For instance, I use the PayPal development servers locally and on the staging server, but the real PayPal site in production.<\/p>\n<p><strong><span class=\"Apple-style-span\" style=\"font-size: large\">Conclusion<\/span><\/strong><\/p>\n<p>With a pretty simple Maven configuration, it\u2019s possible to create a very reproducible build and deployment environment. Add a continuous integration server and you\u2019re on your way to the perfect lean setup.<\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/www.streamhead.com\/google-appengine-staging-server\/\">A Google Appengine Staging Server Howto<\/a>&nbsp;from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a><span class=\"Apple-style-span\" style=\"font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif\"><span class=\"Apple-style-span\" style=\"font-size: 14px;line-height: 18px\"><strong>&nbsp;<\/strong><\/span><\/span>Peter Backx at the&nbsp;<a href=\"http:\/\/www.streamhead.com\/\">Streamhead<\/a>&nbsp;blog. <\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Out of the box, Google\u2019s App Engine supports versioned deployments. You can switch back and forth between revisions very easily, which is a great feature for properly testing an application before going live. There is one major problem: All versions of the application share the same datastore. So if you\u2019re migrating your data you run &hellip;<\/p>\n","protected":false},"author":142,"featured_media":120,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[179],"class_list":["post-893","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-google-app-engine"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Google Appengine Staging Server Howto - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Out of the box, Google\u2019s App Engine supports versioned deployments. You can switch back and forth between revisions very easily, which is a great feature\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Google Appengine Staging Server Howto - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Out of the box, Google\u2019s App Engine supports versioned deployments. You can switch back and forth between revisions very easily, which is a great feature\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-02-23T16:16:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T22:56:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Peter Backx\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Peter Backx\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html\"},\"author\":{\"name\":\"Peter Backx\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/33da7dc5e9af609ff5f04cc71ab3ff71\"},\"headline\":\"Google Appengine Staging Server Howto\",\"datePublished\":\"2012-02-23T16:16:00+00:00\",\"dateModified\":\"2012-10-21T22:56:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html\"},\"wordCount\":719,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-app-engine-logo.jpg\",\"keywords\":[\"Google App Engine\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html\",\"name\":\"Google Appengine Staging Server Howto - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-app-engine-logo.jpg\",\"datePublished\":\"2012-02-23T16:16:00+00:00\",\"dateModified\":\"2012-10-21T22:56:29+00:00\",\"description\":\"Out of the box, Google\u2019s App Engine supports versioned deployments. You can switch back and forth between revisions very easily, which is a great feature\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-app-engine-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-app-engine-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/02\\\/google-appengine-staging-server-howto.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Google Appengine Staging Server Howto\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/33da7dc5e9af609ff5f04cc71ab3ff71\",\"name\":\"Peter Backx\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/495603b4a9796668c31bf8ff233fb717458135b3b70aab4601c988d2a6513db6?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/495603b4a9796668c31bf8ff233fb717458135b3b70aab4601c988d2a6513db6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/495603b4a9796668c31bf8ff233fb717458135b3b70aab4601c988d2a6513db6?s=96&d=mm&r=g\",\"caption\":\"Peter Backx\"},\"sameAs\":[\"http:\\\/\\\/www.streamhead.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Peter-Backx\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Google Appengine Staging Server Howto - Java Code Geeks","description":"Out of the box, Google\u2019s App Engine supports versioned deployments. You can switch back and forth between revisions very easily, which is a great feature","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html","og_locale":"en_US","og_type":"article","og_title":"Google Appengine Staging Server Howto - Java Code Geeks","og_description":"Out of the box, Google\u2019s App Engine supports versioned deployments. You can switch back and forth between revisions very easily, which is a great feature","og_url":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-02-23T16:16:00+00:00","article_modified_time":"2012-10-21T22:56:29+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","type":"image\/jpeg"}],"author":"Peter Backx","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Peter Backx","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html"},"author":{"name":"Peter Backx","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/33da7dc5e9af609ff5f04cc71ab3ff71"},"headline":"Google Appengine Staging Server Howto","datePublished":"2012-02-23T16:16:00+00:00","dateModified":"2012-10-21T22:56:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html"},"wordCount":719,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","keywords":["Google App Engine"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html","url":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html","name":"Google Appengine Staging Server Howto - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","datePublished":"2012-02-23T16:16:00+00:00","dateModified":"2012-10-21T22:56:29+00:00","description":"Out of the box, Google\u2019s App Engine supports versioned deployments. You can switch back and forth between revisions very easily, which is a great feature","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/02\/google-appengine-staging-server-howto.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Google Appengine Staging Server Howto"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/33da7dc5e9af609ff5f04cc71ab3ff71","name":"Peter Backx","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/495603b4a9796668c31bf8ff233fb717458135b3b70aab4601c988d2a6513db6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/495603b4a9796668c31bf8ff233fb717458135b3b70aab4601c988d2a6513db6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/495603b4a9796668c31bf8ff233fb717458135b3b70aab4601c988d2a6513db6?s=96&d=mm&r=g","caption":"Peter Backx"},"sameAs":["http:\/\/www.streamhead.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Peter-Backx"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/142"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=893"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/893\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/120"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}