http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/intelliJ-scala-plugin-43ad9eb2.png
----------------------------------------------------------------------
diff --git a/images/intellij/intelliJ-scala-plugin-43ad9eb2.png 
b/images/intellij/intelliJ-scala-plugin-43ad9eb2.png
new file mode 100644
index 0000000..7de0023
Binary files /dev/null and b/images/intellij/intelliJ-scala-plugin-43ad9eb2.png 
differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/intellij-config-2-f0d34c12.png
----------------------------------------------------------------------
diff --git a/images/intellij/intellij-config-2-f0d34c12.png 
b/images/intellij/intellij-config-2-f0d34c12.png
deleted file mode 100644
index 5d84ee8..0000000
Binary files a/images/intellij/intellij-config-2-f0d34c12.png and /dev/null 
differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/intellij-dependencies-9520f75f.png
----------------------------------------------------------------------
diff --git a/images/intellij/intellij-dependencies-9520f75f.png 
b/images/intellij/intellij-dependencies-9520f75f.png
deleted file mode 100644
index ff6ec0c..0000000
Binary files a/images/intellij/intellij-dependencies-9520f75f.png and /dev/null 
differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/intellij-module-settings-fb88b688.png
----------------------------------------------------------------------
diff --git a/images/intellij/intellij-module-settings-fb88b688.png 
b/images/intellij/intellij-module-settings-fb88b688.png
new file mode 100644
index 0000000..63c3234
Binary files /dev/null and 
b/images/intellij/intellij-module-settings-fb88b688.png differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/intellij-scala-plugin-2-0edbef71.png
----------------------------------------------------------------------
diff --git a/images/intellij/intellij-scala-plugin-2-0edbef71.png 
b/images/intellij/intellij-scala-plugin-2-0edbef71.png
new file mode 100644
index 0000000..d121255
Binary files /dev/null and 
b/images/intellij/intellij-scala-plugin-2-0edbef71.png differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/intellij-scala-plugin-2-592c697f.png
----------------------------------------------------------------------
diff --git a/images/intellij/intellij-scala-plugin-2-592c697f.png 
b/images/intellij/intellij-scala-plugin-2-592c697f.png
deleted file mode 100644
index 76066ce..0000000
Binary files a/images/intellij/intellij-scala-plugin-2-592c697f.png and 
/dev/null differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/pio-runtime-jar-deps-3f3c99d9.png
----------------------------------------------------------------------
diff --git a/images/intellij/pio-runtime-jar-deps-3f3c99d9.png 
b/images/intellij/pio-runtime-jar-deps-3f3c99d9.png
deleted file mode 100644
index 84410ed..0000000
Binary files a/images/intellij/pio-runtime-jar-deps-3f3c99d9.png and /dev/null 
differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/pio-runtime-jars-266e8c1b.png
----------------------------------------------------------------------
diff --git a/images/intellij/pio-runtime-jars-266e8c1b.png 
b/images/intellij/pio-runtime-jars-266e8c1b.png
deleted file mode 100644
index 587bf04..0000000
Binary files a/images/intellij/pio-runtime-jars-266e8c1b.png and /dev/null 
differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/pio-train-e4117867.png
----------------------------------------------------------------------
diff --git a/images/intellij/pio-train-e4117867.png 
b/images/intellij/pio-train-e4117867.png
new file mode 100644
index 0000000..d5c4647
Binary files /dev/null and b/images/intellij/pio-train-e4117867.png differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/images/intellij/pio-train-env-vars-36b4c5bd.png
----------------------------------------------------------------------
diff --git a/images/intellij/pio-train-env-vars-36b4c5bd.png 
b/images/intellij/pio-train-env-vars-36b4c5bd.png
new file mode 100644
index 0000000..5c9675b
Binary files /dev/null and b/images/intellij/pio-train-env-vars-36b4c5bd.png 
differ

http://git-wip-us.apache.org/repos/asf/predictionio-site/blob/5486d086/resources/intellij/index.html
----------------------------------------------------------------------
diff --git a/resources/intellij/index.html b/resources/intellij/index.html
index 2bd2637..187c12b 100644
--- a/resources/intellij/index.html
+++ b/resources/intellij/index.html
@@ -1,54 +1,11 @@
-<!DOCTYPE html><html><head><title>Developing Engines with IntelliJ 
IDEA</title><meta charset="utf-8"/><meta content="IE=edge,chrome=1" 
http-equiv="X-UA-Compatible"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><meta class="swiftype" 
name="title" data-type="string" content="Developing Engines with IntelliJ 
IDEA"/><link rel="canonical" 
href="https://predictionio.apache.org/resources/intellij/"/><link 
href="/images/favicon/normal-b330020a.png" rel="shortcut icon"/><link 
href="/images/favicon/apple-c0febcf2.png" rel="apple-touch-icon"/><link 
href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800"
 rel="stylesheet"/><link 
href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" 
rel="stylesheet"/><link href="/stylesheets/application-eccfc6cb.css" 
rel="stylesheet" type="text/css"/><script 
src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script><script
 src="
 
//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><script
 src="//use.typekit.net/pqo0itb.js"></script><script>try{Typekit.load({ async: 
true });}catch(e){}</script></head><body><div id="global"><header><div 
class="container" id="header-wrapper"><div class="row"><div 
class="col-sm-12"><div id="logo-wrapper"><span id="drawer-toggle"></span><a 
href="#"></a><a href="http://predictionio.apache.org/";><img alt="Apache 
PredictionIO" id="logo" 
src="/images/logos/logo-ee2b9bb3.png"/></a><span>®</span></div><div 
id="menu-wrapper"><div id="pill-wrapper"><a class="pill left" 
href="/gallery/template-gallery">TEMPLATES</a> <a class="pill right" 
href="//github.com/apache/predictionio/">OPEN SOURCE</a></div></div><img 
class="mobile-search-bar-toggler hidden-md hidden-lg" 
src="/images/icons/search-glass-704bd4ff.png"/></div></div></div></header><div 
id="search-bar-row-wrapper"><div class="container-fluid" 
id="search-bar-row"><div class="row"><div class="col-md-9 col-
 sm-11 col-xs-11"><div class="hidden-md hidden-lg" 
id="mobile-page-heading-wrapper"><p>PredictionIO Docs</p><h4>Developing Engines 
with IntelliJ IDEA</h4></div><h4 class="hidden-sm hidden-xs">PredictionIO 
Docs</h4></div><div class="col-md-3 col-sm-1 col-xs-1 hidden-md hidden-lg"><img 
id="left-menu-indicator" 
src="/images/icons/down-arrow-dfe9f7fe.png"/></div><div class="col-md-3 
col-sm-12 col-xs-12 swiftype-wrapper"><div class="swiftype"><form 
class="search-form"><img class="search-box-toggler hidden-xs hidden-sm" 
src="/images/icons/search-glass-704bd4ff.png"/><div class="search-box"><img 
src="/images/icons/search-glass-704bd4ff.png"/><input type="text" 
id="st-search-input" class="st-search-input" placeholder="Search 
Doc..."/></div><img class="swiftype-row-hider hidden-md hidden-lg" 
src="/images/icons/drawer-toggle-active-fcbef12a.png"/></form></div></div><div 
class="mobile-left-menu-toggler hidden-md 
hidden-lg"></div></div></div></div><div id="page" class="container-fluid"><div 
clas
 s="row"><div id="left-menu-wrapper" class="col-md-3"><nav 
id="nav-main"><ul><li class="level-1"><a class="expandible" 
href="/"><span>Apache PredictionIO® Documentation</span></a><ul><li 
class="level-2"><a class="final" href="/"><span>Welcome to Apache 
PredictionIO®</span></a></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>Getting Started</span></a><ul><li 
class="level-2"><a class="final" href="/start/"><span>A Quick 
Intro</span></a></li><li class="level-2"><a class="final" 
href="/install/"><span>Installing Apache PredictionIO</span></a></li><li 
class="level-2"><a class="final" href="/start/download/"><span>Downloading an 
Engine Template</span></a></li><li class="level-2"><a class="final" 
href="/start/deploy/"><span>Deploying Your First Engine</span></a></li><li 
class="level-2"><a class="final" href="/start/customize/"><span>Customizing the 
Engine</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>Integrating with Your App</spa
 n></a><ul><li class="level-2"><a class="final" 
href="/appintegration/"><span>App Integration Overview</span></a></li><li 
class="level-2"><a class="expandible" href="/sdk/"><span>List of 
SDKs</span></a><ul><li class="level-3"><a class="final" 
href="/sdk/java/"><span>Java & Android SDK</span></a></li><li 
class="level-3"><a class="final" href="/sdk/php/"><span>PHP 
SDK</span></a></li><li class="level-3"><a class="final" 
href="/sdk/python/"><span>Python SDK</span></a></li><li class="level-3"><a 
class="final" href="/sdk/ruby/"><span>Ruby SDK</span></a></li><li 
class="level-3"><a class="final" href="/sdk/community/"><span>Community Powered 
SDKs</span></a></li></ul></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>Deploying an Engine</span></a><ul><li 
class="level-2"><a class="final" href="/deploy/"><span>Deploying as a Web 
Service</span></a></li><li class="level-2"><a class="final" 
href="/batchpredict/"><span>Batch Predictions</span></a></li><li 
class="level-2"><a cla
 ss="final" href="/deploy/monitoring/"><span>Monitoring 
Engine</span></a></li><li class="level-2"><a class="final" 
href="/deploy/engineparams/"><span>Setting Engine Parameters</span></a></li><li 
class="level-2"><a class="final" href="/deploy/enginevariants/"><span>Deploying 
Multiple Engine Variants</span></a></li><li class="level-2"><a class="final" 
href="/deploy/plugin/"><span>Engine Server Plugin</span></a></li></ul></li><li 
class="level-1"><a class="expandible" href="#"><span>Customizing an 
Engine</span></a><ul><li class="level-2"><a class="final" 
href="/customize/"><span>Learning DASE</span></a></li><li class="level-2"><a 
class="final" href="/customize/dase/"><span>Implement DASE</span></a></li><li 
class="level-2"><a class="final" 
href="/customize/troubleshooting/"><span>Troubleshooting Engine 
Development</span></a></li><li class="level-2"><a class="final" 
href="/api/current/#package"><span>Engine Scala 
APIs</span></a></li></ul></li><li class="level-1"><a class="expandible" href=
 "#"><span>Collecting and Analyzing Data</span></a><ul><li class="level-2"><a 
class="final" href="/datacollection/"><span>Event Server 
Overview</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/eventapi/"><span>Collecting Data with 
REST/SDKs</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/eventmodel/"><span>Events Modeling</span></a></li><li 
class="level-2"><a class="final" 
href="/datacollection/webhooks/"><span>Unifying Multichannel Data with 
Webhooks</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/channel/"><span>Channel</span></a></li><li 
class="level-2"><a class="final" 
href="/datacollection/batchimport/"><span>Importing Data in 
Batch</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/analytics/"><span>Using Analytics 
Tools</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/plugin/"><span>Event Server 
Plugin</span></a></li></ul></li><li class="level-1"><a clas
 s="expandible" href="#"><span>Choosing an Algorithm(s)</span></a><ul><li 
class="level-2"><a class="final" href="/algorithm/"><span>Built-in Algorithm 
Libraries</span></a></li><li class="level-2"><a class="final" 
href="/algorithm/switch/"><span>Switching to Another 
Algorithm</span></a></li><li class="level-2"><a class="final" 
href="/algorithm/multiple/"><span>Combining Multiple 
Algorithms</span></a></li><li class="level-2"><a class="final" 
href="/algorithm/custom/"><span>Adding Your Own 
Algorithms</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>ML Tuning and Evaluation</span></a><ul><li class="level-2"><a 
class="final" href="/evaluation/"><span>Overview</span></a></li><li 
class="level-2"><a class="final" 
href="/evaluation/paramtuning/"><span>Hyperparameter Tuning</span></a></li><li 
class="level-2"><a class="final" 
href="/evaluation/evaluationdashboard/"><span>Evaluation 
Dashboard</span></a></li><li class="level-2"><a class="final" 
href="/evaluation/m
 etricchoose/"><span>Choosing Evaluation Metrics</span></a></li><li 
class="level-2"><a class="final" href="/evaluation/metricbuild/"><span>Building 
Evaluation Metrics</span></a></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>System Architecture</span></a><ul><li 
class="level-2"><a class="final" href="/system/"><span>Architecture 
Overview</span></a></li><li class="level-2"><a class="final" 
href="/system/anotherdatastore/"><span>Using Another Data 
Store</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>PredictionIO® Official Templates</span></a><ul><li 
class="level-2"><a class="final" 
href="/templates/"><span>Intro</span></a></li><li class="level-2"><a 
class="expandible" href="#"><span>Recommendation</span></a><ul><li 
class="level-3"><a class="final" 
href="/templates/recommendation/quickstart/"><span>Quick 
Start</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/dase/"><span>DASE</span></a></li><l
 i class="level-3"><a class="final" 
href="/templates/recommendation/evaluation/"><span>Evaluation 
Explained</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/how-to/"><span>How-To</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/recommendation/reading-custom-events/"><span>Read Custom 
Events</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/customize-data-prep/"><span>Customize Data 
Preparator</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/customize-serving/"><span>Customize 
Serving</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/training-with-implicit-preference/"><span>Train 
with Implicit Preference</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/blacklist-items/"><span>Filter Recommended 
Items by Blacklist in Query</span></a></li><li class="level-3"><a class="final" 
href="/templates/reco
 mmendation/batch-evaluator/"><span>Batch Persistable 
Evaluator</span></a></li></ul></li><li class="level-2"><a class="expandible" 
href="#"><span>E-Commerce Recommendation</span></a><ul><li class="level-3"><a 
class="final" href="/templates/ecommercerecommendation/quickstart/"><span>Quick 
Start</span></a></li><li class="level-3"><a class="final" 
href="/templates/ecommercerecommendation/dase/"><span>DASE</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/ecommercerecommendation/how-to/"><span>How-To</span></a></li><li
 class="level-3"><a class="final" 
href="/templates/ecommercerecommendation/train-with-rate-event/"><span>Train 
with Rate Event</span></a></li><li class="level-3"><a class="final" 
href="/templates/ecommercerecommendation/adjust-score/"><span>Adjust 
Score</span></a></li></ul></li><li class="level-2"><a class="expandible" 
href="#"><span>Similar Product</span></a><ul><li class="level-3"><a 
class="final" href="/templates/similarproduct/quickstart/"><span>Quick
  Start</span></a></li><li class="level-3"><a class="final" 
href="/templates/similarproduct/dase/"><span>DASE</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/similarproduct/how-to/"><span>How-To</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/similarproduct/multi-events-multi-algos/"><span>Multiple 
Events and Multiple Algorithms</span></a></li><li class="level-3"><a 
class="final" 
href="/templates/similarproduct/return-item-properties/"><span>Returns Item 
Properties</span></a></li><li class="level-3"><a class="final" 
href="/templates/similarproduct/train-with-rate-event/"><span>Train with Rate 
Event</span></a></li><li class="level-3"><a class="final" 
href="/templates/similarproduct/rid-user-set-event/"><span>Get Rid of Events 
for Users</span></a></li><li class="level-3"><a class="final" 
href="/templates/similarproduct/recommended-user/"><span>Recommend 
Users</span></a></li></ul></li><li class="level-2"><a class="expandible" 
href="#"><span>Clas
 sification</span></a><ul><li class="level-3"><a class="final" 
href="/templates/classification/quickstart/"><span>Quick 
Start</span></a></li><li class="level-3"><a class="final" 
href="/templates/classification/dase/"><span>DASE</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/classification/how-to/"><span>How-To</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/classification/add-algorithm/"><span>Use Alternative 
Algorithm</span></a></li><li class="level-3"><a class="final" 
href="/templates/classification/reading-custom-properties/"><span>Read Custom 
Properties</span></a></li></ul></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>Engine Template Gallery</span></a><ul><li 
class="level-2"><a class="final" 
href="/gallery/template-gallery/"><span>Browse</span></a></li><li 
class="level-2"><a class="final" 
href="/community/submit-template/"><span>Submit your Engine as a 
Template</span></a></li></ul></li><li class="level-1"><a cla
 ss="expandible" href="#"><span>Demo Tutorials</span></a><ul><li 
class="level-2"><a class="final" href="/demo/tapster/"><span>Comics 
Recommendation Demo</span></a></li><li class="level-2"><a class="final" 
href="/demo/community/"><span>Community Contributed Demo</span></a></li><li 
class="level-2"><a class="final" href="/demo/textclassification/"><span>Text 
Classification Engine Tutorial</span></a></li></ul></li><li class="level-1"><a 
class="expandible" href="/community/"><span>Getting Involved</span></a><ul><li 
class="level-2"><a class="final" 
href="/community/contribute-code/"><span>Contribute Code</span></a></li><li 
class="level-2"><a class="final" 
href="/community/contribute-documentation/"><span>Contribute 
Documentation</span></a></li><li class="level-2"><a class="final" 
href="/community/contribute-sdk/"><span>Contribute a SDK</span></a></li><li 
class="level-2"><a class="final" 
href="/community/contribute-webhook/"><span>Contribute a 
Webhook</span></a></li><li class="level-2"><a c
 lass="final" href="/community/projects/"><span>Community 
Projects</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>Getting Help</span></a><ul><li class="level-2"><a class="final" 
href="/resources/faq/"><span>FAQs</span></a></li><li class="level-2"><a 
class="final" href="/support/"><span>Support</span></a></li></ul></li><li 
class="level-1"><a class="expandible" 
href="#"><span>Resources</span></a><ul><li class="level-2"><a class="final" 
href="/cli/"><span>Command-line Interface</span></a></li><li class="level-2"><a 
class="final" href="/resources/release/"><span>Release 
Cadence</span></a></li><li class="level-2"><a class="final active" 
href="/resources/intellij/"><span>Developing Engines with IntelliJ 
IDEA</span></a></li><li class="level-2"><a class="final" 
href="/resources/upgrade/"><span>Upgrade Instructions</span></a></li><li 
class="level-2"><a class="final" 
href="/resources/glossary/"><span>Glossary</span></a></li></ul></li><li 
class="level-1"><a cl
 ass="expandible" href="#"><span>Apache Software Foundation</span></a><ul><li 
class="level-2"><a class="final" href="https://www.apache.org/";><span>Apache 
Homepage</span></a></li><li class="level-2"><a class="final" 
href="https://www.apache.org/licenses/";><span>License</span></a></li><li 
class="level-2"><a class="final" 
href="https://www.apache.org/foundation/sponsorship.html";><span>Sponsorship</span></a></li><li
 class="level-2"><a class="final" 
href="https://www.apache.org/foundation/thanks.html";><span>Thanks</span></a></li><li
 class="level-2"><a class="final" 
href="https://www.apache.org/security/";><span>Security</span></a></li></ul></li></ul></nav></div><div
 class="col-md-9 col-sm-12"><div class="content-header hidden-md 
hidden-lg"><div id="breadcrumbs" class="hidden-sm hidden xs"><ul><li><a 
href="#">Resources</a><span class="spacer">&gt;</span></li><li><span 
class="last">Developing Engines with IntelliJ IDEA</span></li></ul></div><div 
id="page-title"><h1>Developing Engines with I
 ntelliJ IDEA</h1></div></div><div id="table-of-content-wrapper"><h5>On this 
page</h5><aside id="table-of-contents"><ul> <li> <a 
href="#prerequisites">Prerequisites</a> </li> <li> <a 
href="#preparing-intellij-for-engine-development">Preparing IntelliJ for Engine 
Development</a> </li> <li> <a 
href="#running-and-debugging-in-intellij-idea">Running and Debugging in 
IntelliJ IDEA</a> </li> <li> <a 
href="#loading-a-template-into-intellij-idea">Loading a Template Into Intellij 
IDEA</a> </li> </ul> </aside><hr/><a id="edit-page-link" 
href="https://github.com/apache/predictionio/tree/livedoc/docs/manual/source/resources/intellij.html.md.erb";><img
 src="/images/icons/edit-pencil-d6c1bb3d.png"/>Edit this page</a></div><div 
class="content-header hidden-sm hidden-xs"><div id="breadcrumbs" 
class="hidden-sm hidden xs"><ul><li><a href="#">Resources</a><span 
class="spacer">&gt;</span></li><li><span class="last">Developing Engines with 
IntelliJ IDEA</span></li></ul></div><div id="page-title"><h1>Devel
 oping Engines with IntelliJ IDEA</h1></div></div><div class="content"> <h2 
id='prerequisites' class='header-anchors'>Prerequisites</h2><p>This 
documentation assumes that you have a fully functional PredictionIO setup. If 
you have not installed PredictionIO yet, please follow <a 
href="/install/">these instructions</a>.</p><h2 
id='preparing-intellij-for-engine-development' class='header-anchors'>Preparing 
IntelliJ for Engine Development</h2><h3 id='installing-intellij-scala-plugin' 
class='header-anchors'>Installing IntelliJ Scala Plugin</h3><p>First of all, 
you will need to install the <a 
href="https://plugins.jetbrains.com/plugin/?id=1347";>Scala plugin</a> if you 
have not already done so.</p><p>Go to the <em>Preferences</em> menu item, and 
look for <em>Plugins</em>. You should see the following screen.</p><p><img 
alt="IntelliJ Plugins" 
src="/images/intellij/intelliJ-scala-plugin-09ee074a.png"/></p><p>Click 
<em>Install JetBrains plugin...</em>, the search for <em>Scala</em>. You shoul
 d arrive at something similar to the following.</p><p><img alt="Scala Plugin" 
src="/images/intellij/intellij-scala-plugin-2-592c697f.png"/></p><p>Click the 
green <em>Install plugin</em> button to install the plugin. Restart IntelliJ 
IDEA if asked to do so.</p><h3 id='setting-up-the-engine-directory' 
class='header-anchors'>Setting Up the Engine Directory</h3><div 
class="alert-message info"><p>It is very important to run at least <code>pio 
build</code> once in your engine directory so that the project correctly 
recognizes the version of PredictionIO that you are using. If you upgraded your 
PredictionIO installation later, you will need to run <code>pio build</code> 
again in order for the engine to pick up the latest version of 
PredictionIO.</p></div><p>Create an engine directory from a template. This 
requires that you install a template that you wish to start from or modify. 
Follow template <a href="/start/download">install</a> and <a 
href="/start/deploy">deploy</a> instructions or go
  through the <a href="/templates/recommendation/quickstart/">Quick Start</a> 
if you are planning to modify a recommender. Make sure to build, train, and 
deploy the engine to make sure all is configured properly.</p><p>From IntelliJ 
IDEA, choose <em>File</em> &gt; <em>New</em> &gt; <em>Project from Existing 
Sources...</em>. When asked to select a directory to import, browse to the 
engine directory that you downloaded too and proceed. Make sure you pick 
<em>Import project from external model</em> &gt; <em>SBT</em>, then proceed to 
finish.</p><p>You should be able to build the project at this point. To run and 
debug PredictionIO server, continue on to the rest of the steps.</p><div 
class="alert-message info"><p>If you are running on OS X, you will need to do 
the following due to this <a href="http://bit.ly/12Abtvn";>known 
issue</a>.</p></div><p>Edit <code>build.sbt</code> and add the following under 
<code>libraryDependencies</code></p><div class="highlight shell"><table 
style="border-sp
 acing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1</pre></td><td class="code"><pre><span 
class="s2">"org.xerial.snappy"</span> % <span class="s2">"snappy-java"</span> % 
<span class="s2">"1.1.1.7"</span>
-</pre></td></tr></tbody></table> </div> <p><img alt="Updating build.sbt" 
src="/images/intellij/intellij-buildsbt-05cfd141.png"/></p><p>When you are done 
editing, IntelliJ should either refresh the project automatically or prompt you 
to refresh.</p><h3 id='dependencies' 
class='header-anchors'>Dependencies</h3><p>IntelliJ has the annoying tendency 
to drop some dependencies when you refresh your build.sbt after any changes. To 
avoid this we put any jars that must be available at runtime into a separate 
empty module in the project then we make the main engine project depend on this 
dummy module for runtime classes.</p><p>Right click on the project and click 
<em>Open Module Settings</em>. In the second modules column hit 
<strong>+</strong> and create a new Scala module. Name it pio-runtime-jars and 
add these assemblies under the module dependencies tab and remember to change 
the scope of the jars to <strong>runtime</strong>:</p> <ul> <li><p> 
<code>pio-assembly-0.12.1.jar</code></p><p>Thi
 s JAR can be found inside the <code>assembly</code> or <code>lib</code> 
directory of your PredictionIO installation directory.</p></li> <li><p> 
<code>spark-assembly-2.1.1-hadoop2.4.0.jar</code></p><p>This JAR can be found 
inside the <code>assembly</code> or <code>lib</code> directory of your Apache 
Spark installation directory.</p></li> </ul> <p><img alt="Create empty module 
and add dependencies" 
src="/images/intellij/pio-runtime-jar-deps-3f3c99d9.png"/></p><p>Now make your 
engine module dependent on the pio-runtime-jars module for scope = 
runtime.</p><p><img alt="Create empty module and add dependencies" 
src="/images/intellij/pio-runtime-jars-266e8c1b.png"/></p><h2 
id='running-and-debugging-in-intellij-idea' class='header-anchors'>Running and 
Debugging in IntelliJ IDEA</h2><h3 id='simulating-<code>pio-train</code>' 
class='header-anchors' >Simulating <code>pio train</code></h3><p>Create a new 
<em>Run/Debug Configuration</em> by going to <em>Run</em> &gt; <em>Edit 
Configurations...</
 em>. Click on the <strong>+</strong> button and select <em>Application</em>. 
Name it <code>pio train</code> and put in the following.</p><div 
class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td 
class="gutter gl" style="text-align: right"><pre class="lineno">1
-2
-3</pre></td><td class="code"><pre>Main class: 
org.apache.predictionio.workflow.CreateWorkflow
-VM options: -Dspark.master<span class="o">=</span><span 
class="nb">local</span> -Dlog4j.configuration<span 
class="o">=</span>file:/<span 
class="k">**</span>replace_with_your_PredictionIO_path<span 
class="k">**</span>/conf/log4j.properties
-Program arguments: --engine-id dummy --engine-version dummy --engine-variant 
engine.json
-</pre></td></tr></tbody></table> </div> <p>Click the <strong>...</strong> 
button to the right of <em>Environment variables</em>, and paste the 
following.</p><div class="highlight shell"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21</pre></td><td class="code"><pre><span class="nv">SPARK_HOME</span><span 
class="o">=</span>/<span 
class="k">**</span>reaplce_w_your_spark_binary_path<span class="k">**</span>
-<span class="nv">PIO_FS_BASEDIR</span><span class="o">=</span>/<span 
class="k">**</span>replace_w_your_path_to<span class="k">**</span>/.pio_store
-<span class="nv">PIO_FS_ENGINESDIR</span><span class="o">=</span>/<span 
class="k">**</span>replace_w_your_path_to<span 
class="k">**</span>/.pio_store/engines
-<span class="nv">PIO_FS_TMPDIR</span><span class="o">=</span>/<span 
class="k">**</span>replace_w_your_path_to<span class="k">*</span>/.pio_store/tmp
-<span class="nv">PIO_STORAGE_REPOSITORIES_METADATA_NAME</span><span 
class="o">=</span>predictionio_metadata
-<span class="nv">PIO_STORAGE_REPOSITORIES_METADATA_SOURCE</span><span 
class="o">=</span>ELASTICSEARCH
-<span class="nv">PIO_STORAGE_REPOSITORIES_MODELDATA_NAME</span><span 
class="o">=</span>pio_
-<span class="nv">PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE</span><span 
class="o">=</span>LOCALFS
-<span class="nv">PIO_STORAGE_REPOSITORIES_APPDATA_NAME</span><span 
class="o">=</span>predictionio_appdata
-<span class="nv">PIO_STORAGE_REPOSITORIES_APPDATA_SOURCE</span><span 
class="o">=</span>ELASTICSEARCH
-<span class="nv">PIO_STORAGE_REPOSITORIES_EVENTDATA_NAME</span><span 
class="o">=</span>predictionio_eventdata
-<span class="nv">PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE</span><span 
class="o">=</span>HBASE
-<span class="nv">PIO_STORAGE_SOURCES_ELASTICSEARCH_TYPE</span><span 
class="o">=</span>elasticsearch
-<span class="nv">PIO_STORAGE_SOURCES_ELASTICSEARCH_HOSTS</span><span 
class="o">=</span>localhost
-<span class="nv">PIO_STORAGE_SOURCES_ELASTICSEARCH_PORTS</span><span 
class="o">=</span>9300
-<span class="nv">PIO_STORAGE_SOURCES_LOCALFS_TYPE</span><span 
class="o">=</span>localfs
-<span class="nv">PIO_STORAGE_SOURCES_LOCALFS_HOSTS</span><span 
class="o">=</span>/<span class="k">**</span>replace_w_your_path_to<span 
class="k">**</span>/.pio_store/models
-<span class="nv">PIO_STORAGE_SOURCES_LOCALFS_PORTS</span><span 
class="o">=</span>0
-<span class="nv">PIO_STORAGE_SOURCES_HBASE_TYPE</span><span 
class="o">=</span>hbase
-<span class="nv">PIO_STORAGE_SOURCES_HBASE_HOSTS</span><span 
class="o">=</span>0
-<span class="nv">PIO_STORAGE_SOURCES_HBASE_PORTS</span><span 
class="o">=</span>0
-</pre></td></tr></tbody></table> </div> <div class="alert-message 
info"><p>Remember to replace all paths that start with <code>**replace</code> 
with actual values. The directory <code>.pio_store</code> typically locates 
inside your home directory.</p></div><p>The end result should look something 
similar to this.</p><p><img alt="Run Configuration" 
src="/images/intellij/intellij-config-48c05039.png"/></p><p>Save and you can 
run or debug <code>pio train</code> with the new configuration!</p><h3 
id='simulating-<code>pio-deploy</code>' class='header-anchors' >Simulating 
<code>pio deploy</code></h3><p>For <code>pio deploy</code>, simply duplicate 
the previous configuration and replace with the following.</p><div 
class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td 
class="gutter gl" style="text-align: right"><pre class="lineno">1
-2</pre></td><td class="code"><pre>Main class: 
org.apache.predictionio.workflow.CreateServer
-Program Arguments: --engineInstanceId <span 
class="k">**</span>replace_with_the_id_from_pio_train<span class="k">**</span>
-</pre></td></tr></tbody></table> </div> <h3 id='executing-a-query' 
class='header-anchors'>Executing a Query</h3><p>You can execute a query with 
the correct SDK. For a recommender that has been trained with the sample 
MovieLens dataset perhaps the easiest query is a curl one. Start by running or 
debuging your <code>deploy</code> config so the service is waiting for the 
query. Then go to the &quot;Terminal&quot; tab at the very bottom of the IDEA 
window and enter the curl request:</p><p><code>$ curl -H &quot;Content-Type: 
application/json&quot; -d &#39;{ &quot;user&quot;: &quot;1&quot;, 
&quot;num&quot;: 4 }&#39; http://localhost:8000/queries.json</code></p><p>This 
should return something like:</p><div class="highlight shell"><table 
style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: 
right"><pre class="lineno">1
+<!DOCTYPE html><html><head><title>Developing Engines with IntelliJ 
IDEA</title><meta charset="utf-8"/><meta content="IE=edge,chrome=1" 
http-equiv="X-UA-Compatible"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><meta class="swiftype" 
name="title" data-type="string" content="Developing Engines with IntelliJ 
IDEA"/><link rel="canonical" 
href="https://predictionio.apache.org/resources/intellij/"/><link 
href="/images/favicon/normal-b330020a.png" rel="shortcut icon"/><link 
href="/images/favicon/apple-c0febcf2.png" rel="apple-touch-icon"/><link 
href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800"
 rel="stylesheet"/><link 
href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" 
rel="stylesheet"/><link href="/stylesheets/application-eccfc6cb.css" 
rel="stylesheet" type="text/css"/><script 
src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script><script
 src="
 
//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><script
 src="//use.typekit.net/pqo0itb.js"></script><script>try{Typekit.load({ async: 
true });}catch(e){}</script></head><body><div id="global"><header><div 
class="container" id="header-wrapper"><div class="row"><div 
class="col-sm-12"><div id="logo-wrapper"><span id="drawer-toggle"></span><a 
href="#"></a><a href="http://predictionio.apache.org/";><img alt="Apache 
PredictionIO" id="logo" 
src="/images/logos/logo-ee2b9bb3.png"/></a><span>®</span></div><div 
id="menu-wrapper"><div id="pill-wrapper"><a class="pill left" 
href="/gallery/template-gallery">TEMPLATES</a> <a class="pill right" 
href="//github.com/apache/predictionio/">OPEN SOURCE</a></div></div><img 
class="mobile-search-bar-toggler hidden-md hidden-lg" 
src="/images/icons/search-glass-704bd4ff.png"/></div></div></div></header><div 
id="search-bar-row-wrapper"><div class="container-fluid" 
id="search-bar-row"><div class="row"><div class="col-md-9 col-
 sm-11 col-xs-11"><div class="hidden-md hidden-lg" 
id="mobile-page-heading-wrapper"><p>PredictionIO Docs</p><h4>Developing Engines 
with IntelliJ IDEA</h4></div><h4 class="hidden-sm hidden-xs">PredictionIO 
Docs</h4></div><div class="col-md-3 col-sm-1 col-xs-1 hidden-md hidden-lg"><img 
id="left-menu-indicator" 
src="/images/icons/down-arrow-dfe9f7fe.png"/></div><div class="col-md-3 
col-sm-12 col-xs-12 swiftype-wrapper"><div class="swiftype"><form 
class="search-form"><img class="search-box-toggler hidden-xs hidden-sm" 
src="/images/icons/search-glass-704bd4ff.png"/><div class="search-box"><img 
src="/images/icons/search-glass-704bd4ff.png"/><input type="text" 
id="st-search-input" class="st-search-input" placeholder="Search 
Doc..."/></div><img class="swiftype-row-hider hidden-md hidden-lg" 
src="/images/icons/drawer-toggle-active-fcbef12a.png"/></form></div></div><div 
class="mobile-left-menu-toggler hidden-md 
hidden-lg"></div></div></div></div><div id="page" class="container-fluid"><div 
clas
 s="row"><div id="left-menu-wrapper" class="col-md-3"><nav 
id="nav-main"><ul><li class="level-1"><a class="expandible" 
href="/"><span>Apache PredictionIO® Documentation</span></a><ul><li 
class="level-2"><a class="final" href="/"><span>Welcome to Apache 
PredictionIO®</span></a></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>Getting Started</span></a><ul><li 
class="level-2"><a class="final" href="/start/"><span>A Quick 
Intro</span></a></li><li class="level-2"><a class="final" 
href="/install/"><span>Installing Apache PredictionIO</span></a></li><li 
class="level-2"><a class="final" href="/start/download/"><span>Downloading an 
Engine Template</span></a></li><li class="level-2"><a class="final" 
href="/start/deploy/"><span>Deploying Your First Engine</span></a></li><li 
class="level-2"><a class="final" href="/start/customize/"><span>Customizing the 
Engine</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>Integrating with Your App</spa
 n></a><ul><li class="level-2"><a class="final" 
href="/appintegration/"><span>App Integration Overview</span></a></li><li 
class="level-2"><a class="expandible" href="/sdk/"><span>List of 
SDKs</span></a><ul><li class="level-3"><a class="final" 
href="/sdk/java/"><span>Java & Android SDK</span></a></li><li 
class="level-3"><a class="final" href="/sdk/php/"><span>PHP 
SDK</span></a></li><li class="level-3"><a class="final" 
href="/sdk/python/"><span>Python SDK</span></a></li><li class="level-3"><a 
class="final" href="/sdk/ruby/"><span>Ruby SDK</span></a></li><li 
class="level-3"><a class="final" href="/sdk/community/"><span>Community Powered 
SDKs</span></a></li></ul></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>Deploying an Engine</span></a><ul><li 
class="level-2"><a class="final" href="/deploy/"><span>Deploying as a Web 
Service</span></a></li><li class="level-2"><a class="final" 
href="/batchpredict/"><span>Batch Predictions</span></a></li><li 
class="level-2"><a cla
 ss="final" href="/deploy/monitoring/"><span>Monitoring 
Engine</span></a></li><li class="level-2"><a class="final" 
href="/deploy/engineparams/"><span>Setting Engine Parameters</span></a></li><li 
class="level-2"><a class="final" href="/deploy/enginevariants/"><span>Deploying 
Multiple Engine Variants</span></a></li><li class="level-2"><a class="final" 
href="/deploy/plugin/"><span>Engine Server Plugin</span></a></li></ul></li><li 
class="level-1"><a class="expandible" href="#"><span>Customizing an 
Engine</span></a><ul><li class="level-2"><a class="final" 
href="/customize/"><span>Learning DASE</span></a></li><li class="level-2"><a 
class="final" href="/customize/dase/"><span>Implement DASE</span></a></li><li 
class="level-2"><a class="final" 
href="/customize/troubleshooting/"><span>Troubleshooting Engine 
Development</span></a></li><li class="level-2"><a class="final" 
href="/api/current/#package"><span>Engine Scala 
APIs</span></a></li></ul></li><li class="level-1"><a class="expandible" href=
 "#"><span>Collecting and Analyzing Data</span></a><ul><li class="level-2"><a 
class="final" href="/datacollection/"><span>Event Server 
Overview</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/eventapi/"><span>Collecting Data with 
REST/SDKs</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/eventmodel/"><span>Events Modeling</span></a></li><li 
class="level-2"><a class="final" 
href="/datacollection/webhooks/"><span>Unifying Multichannel Data with 
Webhooks</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/channel/"><span>Channel</span></a></li><li 
class="level-2"><a class="final" 
href="/datacollection/batchimport/"><span>Importing Data in 
Batch</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/analytics/"><span>Using Analytics 
Tools</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/plugin/"><span>Event Server 
Plugin</span></a></li></ul></li><li class="level-1"><a clas
 s="expandible" href="#"><span>Choosing an Algorithm(s)</span></a><ul><li 
class="level-2"><a class="final" href="/algorithm/"><span>Built-in Algorithm 
Libraries</span></a></li><li class="level-2"><a class="final" 
href="/algorithm/switch/"><span>Switching to Another 
Algorithm</span></a></li><li class="level-2"><a class="final" 
href="/algorithm/multiple/"><span>Combining Multiple 
Algorithms</span></a></li><li class="level-2"><a class="final" 
href="/algorithm/custom/"><span>Adding Your Own 
Algorithms</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>ML Tuning and Evaluation</span></a><ul><li class="level-2"><a 
class="final" href="/evaluation/"><span>Overview</span></a></li><li 
class="level-2"><a class="final" 
href="/evaluation/paramtuning/"><span>Hyperparameter Tuning</span></a></li><li 
class="level-2"><a class="final" 
href="/evaluation/evaluationdashboard/"><span>Evaluation 
Dashboard</span></a></li><li class="level-2"><a class="final" 
href="/evaluation/m
 etricchoose/"><span>Choosing Evaluation Metrics</span></a></li><li 
class="level-2"><a class="final" href="/evaluation/metricbuild/"><span>Building 
Evaluation Metrics</span></a></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>System Architecture</span></a><ul><li 
class="level-2"><a class="final" href="/system/"><span>Architecture 
Overview</span></a></li><li class="level-2"><a class="final" 
href="/system/anotherdatastore/"><span>Using Another Data 
Store</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>PredictionIO® Official Templates</span></a><ul><li 
class="level-2"><a class="final" 
href="/templates/"><span>Intro</span></a></li><li class="level-2"><a 
class="expandible" href="#"><span>Recommendation</span></a><ul><li 
class="level-3"><a class="final" 
href="/templates/recommendation/quickstart/"><span>Quick 
Start</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/dase/"><span>DASE</span></a></li><l
 i class="level-3"><a class="final" 
href="/templates/recommendation/evaluation/"><span>Evaluation 
Explained</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/how-to/"><span>How-To</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/recommendation/reading-custom-events/"><span>Read Custom 
Events</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/customize-data-prep/"><span>Customize Data 
Preparator</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/customize-serving/"><span>Customize 
Serving</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/training-with-implicit-preference/"><span>Train 
with Implicit Preference</span></a></li><li class="level-3"><a class="final" 
href="/templates/recommendation/blacklist-items/"><span>Filter Recommended 
Items by Blacklist in Query</span></a></li><li class="level-3"><a class="final" 
href="/templates/reco
 mmendation/batch-evaluator/"><span>Batch Persistable 
Evaluator</span></a></li></ul></li><li class="level-2"><a class="expandible" 
href="#"><span>E-Commerce Recommendation</span></a><ul><li class="level-3"><a 
class="final" href="/templates/ecommercerecommendation/quickstart/"><span>Quick 
Start</span></a></li><li class="level-3"><a class="final" 
href="/templates/ecommercerecommendation/dase/"><span>DASE</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/ecommercerecommendation/how-to/"><span>How-To</span></a></li><li
 class="level-3"><a class="final" 
href="/templates/ecommercerecommendation/train-with-rate-event/"><span>Train 
with Rate Event</span></a></li><li class="level-3"><a class="final" 
href="/templates/ecommercerecommendation/adjust-score/"><span>Adjust 
Score</span></a></li></ul></li><li class="level-2"><a class="expandible" 
href="#"><span>Similar Product</span></a><ul><li class="level-3"><a 
class="final" href="/templates/similarproduct/quickstart/"><span>Quick
  Start</span></a></li><li class="level-3"><a class="final" 
href="/templates/similarproduct/dase/"><span>DASE</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/similarproduct/how-to/"><span>How-To</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/similarproduct/multi-events-multi-algos/"><span>Multiple 
Events and Multiple Algorithms</span></a></li><li class="level-3"><a 
class="final" 
href="/templates/similarproduct/return-item-properties/"><span>Returns Item 
Properties</span></a></li><li class="level-3"><a class="final" 
href="/templates/similarproduct/train-with-rate-event/"><span>Train with Rate 
Event</span></a></li><li class="level-3"><a class="final" 
href="/templates/similarproduct/rid-user-set-event/"><span>Get Rid of Events 
for Users</span></a></li><li class="level-3"><a class="final" 
href="/templates/similarproduct/recommended-user/"><span>Recommend 
Users</span></a></li></ul></li><li class="level-2"><a class="expandible" 
href="#"><span>Clas
 sification</span></a><ul><li class="level-3"><a class="final" 
href="/templates/classification/quickstart/"><span>Quick 
Start</span></a></li><li class="level-3"><a class="final" 
href="/templates/classification/dase/"><span>DASE</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/classification/how-to/"><span>How-To</span></a></li><li 
class="level-3"><a class="final" 
href="/templates/classification/add-algorithm/"><span>Use Alternative 
Algorithm</span></a></li><li class="level-3"><a class="final" 
href="/templates/classification/reading-custom-properties/"><span>Read Custom 
Properties</span></a></li></ul></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>Engine Template Gallery</span></a><ul><li 
class="level-2"><a class="final" 
href="/gallery/template-gallery/"><span>Browse</span></a></li><li 
class="level-2"><a class="final" 
href="/community/submit-template/"><span>Submit your Engine as a 
Template</span></a></li></ul></li><li class="level-1"><a cla
 ss="expandible" href="#"><span>Demo Tutorials</span></a><ul><li 
class="level-2"><a class="final" href="/demo/tapster/"><span>Comics 
Recommendation Demo</span></a></li><li class="level-2"><a class="final" 
href="/demo/community/"><span>Community Contributed Demo</span></a></li><li 
class="level-2"><a class="final" href="/demo/textclassification/"><span>Text 
Classification Engine Tutorial</span></a></li></ul></li><li class="level-1"><a 
class="expandible" href="/community/"><span>Getting Involved</span></a><ul><li 
class="level-2"><a class="final" 
href="/community/contribute-code/"><span>Contribute Code</span></a></li><li 
class="level-2"><a class="final" 
href="/community/contribute-documentation/"><span>Contribute 
Documentation</span></a></li><li class="level-2"><a class="final" 
href="/community/contribute-sdk/"><span>Contribute a SDK</span></a></li><li 
class="level-2"><a class="final" 
href="/community/contribute-webhook/"><span>Contribute a 
Webhook</span></a></li><li class="level-2"><a c
 lass="final" href="/community/projects/"><span>Community 
Projects</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>Getting Help</span></a><ul><li class="level-2"><a class="final" 
href="/resources/faq/"><span>FAQs</span></a></li><li class="level-2"><a 
class="final" href="/support/"><span>Support</span></a></li></ul></li><li 
class="level-1"><a class="expandible" 
href="#"><span>Resources</span></a><ul><li class="level-2"><a class="final" 
href="/cli/"><span>Command-line Interface</span></a></li><li class="level-2"><a 
class="final" href="/resources/release/"><span>Release 
Cadence</span></a></li><li class="level-2"><a class="final active" 
href="/resources/intellij/"><span>Developing Engines with IntelliJ 
IDEA</span></a></li><li class="level-2"><a class="final" 
href="/resources/upgrade/"><span>Upgrade Instructions</span></a></li><li 
class="level-2"><a class="final" 
href="/resources/glossary/"><span>Glossary</span></a></li></ul></li><li 
class="level-1"><a cl
 ass="expandible" href="#"><span>Apache Software Foundation</span></a><ul><li 
class="level-2"><a class="final" href="https://www.apache.org/";><span>Apache 
Homepage</span></a></li><li class="level-2"><a class="final" 
href="https://www.apache.org/licenses/";><span>License</span></a></li><li 
class="level-2"><a class="final" 
href="https://www.apache.org/foundation/sponsorship.html";><span>Sponsorship</span></a></li><li
 class="level-2"><a class="final" 
href="https://www.apache.org/foundation/thanks.html";><span>Thanks</span></a></li><li
 class="level-2"><a class="final" 
href="https://www.apache.org/security/";><span>Security</span></a></li></ul></li></ul></nav></div><div
 class="col-md-9 col-sm-12"><div class="content-header hidden-md 
hidden-lg"><div id="breadcrumbs" class="hidden-sm hidden xs"><ul><li><a 
href="#">Resources</a><span class="spacer">&gt;</span></li><li><span 
class="last">Developing Engines with IntelliJ IDEA</span></li></ul></div><div 
id="page-title"><h1>Developing Engines with I
 ntelliJ IDEA</h1></div></div><div id="table-of-content-wrapper"><h5>On this 
page</h5><aside id="table-of-contents"><ul> <li> <a 
href="#prerequisites">Prerequisites</a> </li> <li> <a 
href="#preparing-intellij-for-engine-development">Preparing IntelliJ for Engine 
Development</a> </li> <li> <a 
href="#running-and-debugging-in-intellij-idea">Running and Debugging in 
IntelliJ IDEA</a> </li> </ul> </aside><hr/><a id="edit-page-link" 
href="https://github.com/apache/predictionio/tree/livedoc/docs/manual/source/resources/intellij.html.md.erb";><img
 src="/images/icons/edit-pencil-d6c1bb3d.png"/>Edit this page</a></div><div 
class="content-header hidden-sm hidden-xs"><div id="breadcrumbs" 
class="hidden-sm hidden xs"><ul><li><a href="#">Resources</a><span 
class="spacer">&gt;</span></li><li><span class="last">Developing Engines with 
IntelliJ IDEA</span></li></ul></div><div id="page-title"><h1>Developing Engines 
with IntelliJ IDEA</h1></div></div><div class="content"> <h2 id='prerequisites' 
class='h
 eader-anchors'>Prerequisites</h2><p>This documentation assumes that you have a 
fully functional PredictionIO setup. If you have not installed PredictionIO 
yet, please follow <a href="/install/">these instructions</a>.</p><p>The 
following instructions have been tested with IntelliJ IDEA 2018.2.2 Community 
Edition.</p><h2 id='preparing-intellij-for-engine-development' 
class='header-anchors'>Preparing IntelliJ for Engine Development</h2><h3 
id='installing-intellij-scala-plugin' class='header-anchors'>Installing 
IntelliJ Scala Plugin</h3><p>First of all, you will need to install the <a 
href="https://plugins.jetbrains.com/plugin/?id=1347";>Scala plugin</a> if you 
have not already done so.</p><p>Go to the <em>Preferences</em> menu item, and 
look for <em>Plugins</em>. You should see the following screen.</p><p><img 
alt="IntelliJ Plugins" 
src="/images/intellij/intelliJ-scala-plugin-43ad9eb2.png"/></p><p>Click 
<em>Install JetBrains plugin...</em>, the search for <em>Scala</em>. You should 
arr
 ive at something similar to the following.</p><p><img alt="Scala Plugin" 
src="/images/intellij/intellij-scala-plugin-2-0edbef71.png"/></p><p>Click the 
green <em>Install plugin</em> button to install the plugin. Restart IntelliJ 
IDEA if asked to do so.</p><h3 id='setting-up-the-engine-directory' 
class='header-anchors'>Setting Up the Engine Directory</h3><p>Create an engine 
directory from a template. This requires that you download a template that you 
wish to start from or modify.</p><p>Follow template <a 
href="/start/download">install</a> and <a href="/start/deploy">deploy</a> 
instructions or go through the <a 
href="/templates/recommendation/quickstart/">Quick Start</a> if you are 
planning to modify a recommender. Make sure to build, train, and deploy the 
engine to make sure all is configured properly.</p><p>From IntelliJ IDEA, 
choose <em>File</em> &gt; <em>New</em> &gt; <em>Project from Existing 
Sources...</em>. When asked to select a directory to import, browse to the 
engine direct
 ory that you downloaded too and proceed. Make sure you pick <em>Import project 
from external model</em> &gt; <em>SBT</em>, then proceed to finish.</p><p>You 
should be able to build the project at this point. To run and debug your 
template, continue on to the rest of the steps.</p><h3 
id='optional:-issues-with-snappy-on-macos' class='header-anchors'>Optional: 
Issues with Snappy on macOS</h3><p>If you are running on macOS and run into the 
following <a href="http://bit.ly/12Abtvn";>known issue</a>, follow steps in this 
section.</p><p>Edit <code>build.sbt</code> and add the following under 
<code>libraryDependencies</code></p><div class="highlight shell"><table 
style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: 
right"><pre class="lineno">1</pre></td><td class="code"><pre><span 
class="s2">"org.xerial.snappy"</span> % <span class="s2">"snappy-java"</span> % 
<span class="s2">"1.1.1.7"</span>
+</pre></td></tr></tbody></table> </div> <p><img alt="Updating build.sbt" 
src="/images/intellij/intellij-buildsbt-05cfd141.png"/></p><p>When you are done 
editing, IntelliJ should prompt you to import new changes, unless you have 
already enabled auto import. Import this change to make it effective.</p><h3 
id='module-settings' class='header-anchors'>Module Settings</h3><div 
class="alert-message info"><p>IntelliJ will recreate module settings whenever 
it imports changes of your project. You will need to repeat this section 
whenever that happens.</p></div><p>Due to the way how <code>pio</code> command 
sources required classes during runtime, it is necessary to add them manually 
in module settings for <em>Run/Debug Configurations</em> to work 
properly.</p><p>Right click on the project and click <em>Open Module 
Settings</em>. Hit the <strong>+</strong> button right below the list of 
dependencies, and select <em>JARs or directories...</em>.</p><p>The first JAR 
that you need to add is the <c
 ode>pio-assembly-0.12.1.jar</code> that contains all necessary classes. It can 
be found inside the <code>dist/lib</code> directory of your PredictionIO source 
installation directory (if you have built from sources) or the <code>lib</code> 
directory of your PredictionIO binary installation directory.</p><p>Next, you 
will need to make sure some configuration files from your PredictionIO 
installation can be found during runtime. Add the <code>conf</code> directory 
of your PredictionIO installation directory. When asked about categories of the 
directory, pick <em>Classes</em>.</p><p>Finally, you will need to add storage 
classes. The exact list of JARs that you will need to add depends on your 
storage configuration. These JARs can be found inside the 
<code>dist/lib/spark</code> directory of your PredictionIO source installation 
directory (if you have built from sources) or the <code>lib/spark</code> 
directory of your PredictionIO binary installation directory.</p> <ul> <li><p> 
<code>pio-
 data-elasticsearch-assembly-0.12.1.jar</code></p><p>Add this JAR if your 
configuration uses Elasticsearch.</p></li> <li><p> 
<code>pio-data-hbase-assembly-0.12.1.jar</code></p><p>Add this JAR if your 
configuration uses Apache HBase.</p></li> <li><p> 
<code>pio-data-hdfs-assembly-0.12.1.jar</code></p><p>Add this JAR if your 
configuration uses HDFS.</p></li> <li><p> 
<code>pio-data-jdbc-assembly-0.12.1.jar</code></p><p>Add this JAR if your 
configuration uses JDBC. Notice that you must also add any additional JDBC 
driver JARs.</p></li> <li><p> 
<code>pio-data-localfs-assembly-0.12.1.jar</code></p><p>Add this JAR if your 
configuration uses local filesystem.</p></li> <li><p> 
<code>pio-data-s3-assembly-0.12.1.jar</code></p><p>Add this JAR if your 
configuration uses Amazon Web Services S3.</p></li> </ul> <p>Make sure to 
change all these additions to <em>Runtime</em> scope. The following shows an 
example that uses the JDBC storage backend with PostgreSQL driver.</p><p><img 
alt="Example module s
 ettings for a JDBC and PostgreSQL configuration" 
src="/images/intellij/intellij-module-settings-fb88b688.png"/></p><h2 
id='running-and-debugging-in-intellij-idea' class='header-anchors'>Running and 
Debugging in IntelliJ IDEA</h2><h3 id='simulating-<code>pio-train</code>' 
class='header-anchors' >Simulating <code>pio train</code></h3><p>Create a new 
<em>Run/Debug Configuration</em> by going to <em>Run</em> &gt; <em>Edit 
Configurations...</em>. Click on the <strong>+</strong> button and select 
<em>Application</em>. Name it <code>pio train</code> and put in the 
following:</p> <ul> <li><p> Main class:</p><div class="highlight shell"><table 
style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: 
right"><pre class="lineno">1</pre></td><td 
class="code"><pre>org.apache.predictionio.workflow.CreateWorkflow
+</pre></td></tr></tbody></table> </div></li> <li><p> VM options:</p><div 
class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td 
class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td 
class="code"><pre>-Dspark.master<span class="o">=</span><span 
class="nb">local</span> -Dlog4j.configuration<span 
class="o">=</span>file:/&lt;your_pio_path&gt;/conf/log4j.properties 
-Dpio.log.dir<span class="o">=</span>&lt;path_of_log_file&gt;
+</pre></td></tr></tbody></table> </div></li> <li><p> Program 
arguments:</p><div class="highlight shell"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1</pre></td><td class="code"><pre>--engine-id dummy 
--engine-version dummy --engine-variant engine.json --env <span 
class="nv">dummy</span><span class="o">=</span>dummy
+</pre></td></tr></tbody></table> </div></li> </ul> <p>Make sure <em>Working 
directory</em> is set to the base directory of the template that you are 
working on.</p><p>Click the folder button to the right of <em>Environment 
variables</em>, and paste the relevant values from <code>conf/pio-env.sh</code> 
in your PredictionIO installation directory. The following shows an example 
using JDBC and PostgreSQL.</p><p><img alt="Example environment variables 
settings" src="/images/intellij/pio-train-env-vars-36b4c5bd.png"/></p><p>Make 
sure <em>Include dependencies with &quot;Provided&quot; scope</em> is 
checked.</p><p>The end result should look something similar to this.</p><p><img 
alt="Run Configuration" 
src="/images/intellij/pio-train-e4117867.png"/></p><p>Save and you can run or 
debug <code>pio train</code> with the new configuration!</p><h3 
id='simulating-<code>pio-deploy</code>' class='header-anchors' >Simulating 
<code>pio deploy</code></h3><p>For <code>pio deploy</code>, simply duplicate
  the previous configuration and replace with the following.</p> <ul> <li><p> 
Main class:</p><div class="highlight shell"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1</pre></td><td 
class="code"><pre>org.apache.predictionio.workflow.CreateServer
+</pre></td></tr></tbody></table> </div></li> <li><p> Program 
Arguments:</p><div class="highlight shell"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1</pre></td><td class="code"><pre>--engineInstanceId 
&lt;id_from_pio_train&gt; --engine-variant engine.json
+</pre></td></tr></tbody></table> </div></li> </ul> <h3 id='executing-a-query' 
class='header-anchors'>Executing a Query</h3><p>You can execute a query with 
the correct SDK. For a recommender that has been trained with the sample 
MovieLens dataset perhaps the easiest query is a <code>curl</code> one. Start 
by running or debuging your <code>pio deploy</code> config so the service is 
waiting for the query. Then go to the &quot;Terminal&quot; tab at the very 
bottom of the IntelliJ IDEA window and enter the <code>curl</code> 
request:</p><div class="highlight shell"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1</pre></td><td class="code"><pre>curl -H <span 
class="s2">"Content-Type: application/json"</span> -d <span class="s1">'{ 
"user": "1", "num": 4 }'</span> http://localhost:8000/queries.json
+</pre></td></tr></tbody></table> </div> <p>This should return something 
like:</p><div class="highlight shell"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1
 2
 3
 4
@@ -59,9 +16,7 @@ Program Arguments: --engineInstanceId <span 
class="k">**</span>replace_with_the_
   <span class="o">{</span><span class="s2">"item"</span>:<span 
class="s2">"89"</span>,<span class="s2">"score"</span>:6.975951244053634<span 
class="o">}</span>,
   <span class="o">{</span><span class="s2">"item"</span>:<span 
class="s2">"34"</span>,<span class="s2">"score"</span>:6.857457277981334<span 
class="o">}</span>
 <span class="o">]}</span>
-</pre></td></tr></tbody></table> </div> <div class="alert-message info"><p>If 
you hit a breakpoint you are likely to get a connection timeout. To see the 
data that would have been returned, just place a breakpoint where the response 
is created or run the query with no breakpoints.</p></div><h2 
id='loading-a-template-into-intellij-idea' class='header-anchors'>Loading a 
Template Into Intellij IDEA</h2><p>To customize an existing <a 
href="/gallery/template-gallery">template</a> using Intellij IDEA, first pull 
it from the template gallery:</p><div class="highlight shell"><table 
style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: 
right"><pre class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ 
</span>git clone &lt;Template Source&gt; &lt;New Engine Directory&gt;
-</pre></td></tr></tbody></table> </div> <p>Now, before opening the template 
with Intellij, run the following command in the new engine template 
directory</p><div class="highlight shell"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1</pre></td><td class="code"><pre><span class="gp">$ </span>pio 
build
-</pre></td></tr></tbody></table> </div> <p>This should update the pioVersion 
key in SBT to the version of PredictionIO you have installed, so that Intellij 
loads the correct JARS via its Auto-Import feature. Now, you can go ahead and 
open the file <code>build.sbt</code> with Intellij IDEA. You are now ready to 
<a href="/customize/">customize</a> your new engine 
template.</p></div></div></div></div><footer><div class="container"><div 
class="seperator"></div><div class="row"><div class="col-md-6 
footer-link-column"><div 
class="footer-link-column-row"><h4>Community</h4><ul><li><a 
href="//predictionio.apache.org/install/" 
target="blank">Download</a></li><li><a href="//predictionio.apache.org/" 
target="blank">Docs</a></li><li><a href="//github.com/apache/predictionio" 
target="blank">GitHub</a></li><li><a 
href="mailto:[email protected]"; target="blank">Subscribe 
to User Mailing List</a></li><li><a 
href="//stackoverflow.com/questions/tagged/predictionio" target="blank">
 Stackoverflow</a></li></ul></div></div><div class="col-md-6 
footer-link-column"><div 
class="footer-link-column-row"><h4>Contribute</h4><ul><li><a 
href="//predictionio.apache.org/community/contribute-code/" 
target="blank">Contribute</a></li><li><a 
href="//github.com/apache/predictionio" target="blank">Source 
Code</a></li><li><a href="//issues.apache.org/jira/browse/PIO" 
target="blank">Bug Tracker</a></li><li><a 
href="mailto:[email protected]"; target="blank">Subscribe to 
Development Mailing List</a></li></ul></div></div></div><div class="row"><div 
class="col-md-12 footer-link-column"><p>Apache PredictionIO, PredictionIO, 
Apache, the Apache feather logo, and the Apache PredictionIO project logo are 
either registered trademarks or trademarks of The Apache Software Foundation in 
the United States and other countries.</p><p>All other marks mentioned may be 
trademarks or registered trademarks of their respective 
owners.</p></div></div></div><div id="footer-bottom"><div 
 class="container"><div class="row"><div class="col-md-12"><div 
id="footer-logo-wrapper"><img alt="PredictionIO" 
src="/images/logos/logo-white-d1e9c6e6.png"/><span>®</span></div><div 
id="social-icons-wrapper"><a class="github-button" 
href="https://github.com/apache/predictionio"; data-style="mega" 
data-count-href="/apache/predictionio/stargazers" 
data-count-api="/repos/apache/predictionio#stargazers_count" 
data-count-aria-label="# stargazers on GitHub" aria-label="Star 
apache/predictionio on GitHub">Star</a> <a class="github-button" 
href="https://github.com/apache/predictionio/fork"; 
data-icon="octicon-git-branch" data-style="mega" 
data-count-href="/apache/predictionio/network" 
data-count-api="/repos/apache/predictionio#forks_count" 
data-count-aria-label="# forks on GitHub" aria-label="Fork apache/predictionio 
on GitHub">Fork</a> <script id="github-bjs" async="" defer="" 
src="https://buttons.github.io/buttons.js";></script><a 
href="https://twitter.com/predictionio"; target="blank"><img 
 alt="PredictionIO on Twitter" src="/images/icons/twitter-ea9dc152.png"/></a> 
<a href="https://www.facebook.com/predictionio"; target="blank"><img 
alt="PredictionIO on Facebook" src="/images/icons/facebook-5c57939c.png"/></a> 
</div></div></div></div></div></footer></div><script>(function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){
+</pre></td></tr></tbody></table> </div> <div class="alert-message info"><p>If 
you hit a breakpoint you are likely to get a connection timeout. To see the 
data that would have been returned, just place a breakpoint where the response 
is created or run the query with no 
breakpoints.</p></div></div></div></div></div><footer><div 
class="container"><div class="seperator"></div><div class="row"><div 
class="col-md-6 footer-link-column"><div 
class="footer-link-column-row"><h4>Community</h4><ul><li><a 
href="//predictionio.apache.org/install/" 
target="blank">Download</a></li><li><a href="//predictionio.apache.org/" 
target="blank">Docs</a></li><li><a href="//github.com/apache/predictionio" 
target="blank">GitHub</a></li><li><a 
href="mailto:[email protected]"; target="blank">Subscribe 
to User Mailing List</a></li><li><a 
href="//stackoverflow.com/questions/tagged/predictionio" 
target="blank">Stackoverflow</a></li></ul></div></div><div class="col-md-6 
footer-link-column"><div c
 lass="footer-link-column-row"><h4>Contribute</h4><ul><li><a 
href="//predictionio.apache.org/community/contribute-code/" 
target="blank">Contribute</a></li><li><a 
href="//github.com/apache/predictionio" target="blank">Source 
Code</a></li><li><a href="//issues.apache.org/jira/browse/PIO" 
target="blank">Bug Tracker</a></li><li><a 
href="mailto:[email protected]"; target="blank">Subscribe to 
Development Mailing List</a></li></ul></div></div></div><div class="row"><div 
class="col-md-12 footer-link-column"><p>Apache PredictionIO, PredictionIO, 
Apache, the Apache feather logo, and the Apache PredictionIO project logo are 
either registered trademarks or trademarks of The Apache Software Foundation in 
the United States and other countries.</p><p>All other marks mentioned may be 
trademarks or registered trademarks of their respective 
owners.</p></div></div></div><div id="footer-bottom"><div 
class="container"><div class="row"><div class="col-md-12"><div 
id="footer-logo-wrapper
 "><img alt="PredictionIO" 
src="/images/logos/logo-white-d1e9c6e6.png"/><span>®</span></div><div 
id="social-icons-wrapper"><a class="github-button" 
href="https://github.com/apache/predictionio"; data-style="mega" 
data-count-href="/apache/predictionio/stargazers" 
data-count-api="/repos/apache/predictionio#stargazers_count" 
data-count-aria-label="# stargazers on GitHub" aria-label="Star 
apache/predictionio on GitHub">Star</a> <a class="github-button" 
href="https://github.com/apache/predictionio/fork"; 
data-icon="octicon-git-branch" data-style="mega" 
data-count-href="/apache/predictionio/network" 
data-count-api="/repos/apache/predictionio#forks_count" 
data-count-aria-label="# forks on GitHub" aria-label="Fork apache/predictionio 
on GitHub">Fork</a> <script id="github-bjs" async="" defer="" 
src="https://buttons.github.io/buttons.js";></script><a 
href="https://twitter.com/predictionio"; target="blank"><img alt="PredictionIO 
on Twitter" src="/images/icons/twitter-ea9dc152.png"/></a> <a href="
 https://www.facebook.com/predictionio"; target="blank"><img alt="PredictionIO 
on Facebook" src="/images/icons/facebook-5c57939c.png"/></a> 
</div></div></div></div></div></footer></div><script>(function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){
 (w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t);
 
e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e);
 })(window,document,'script','//s.swiftypecdn.com/install/v1/st.js','_st');

Reply via email to