google-closure-compilergoogle-closuregoogle-closure-libraryplovr

Why a JSC_MISSING_PROVIDE_ERROR in "Hello World" plovr example?


I'm trying to get started with plovr using the simple "Hello World" example in Closure: The Definitive Guide by Michael Bolin. But my build produces an error. Can anyone out there enlighten me as to my mistake?

Here is my file layout:

C:\hello-plovr
├──hello-config.js
├──hello.js
└──plovr-0744c5209a34.jar

This is the contents of hello.js:

goog.provide( 'example' );
goog.require( 'goog.dom' );  // line 2

example.sayHello = function( message ) {
    goog.dom.getElement( 'hello' ).innerHTML = message;
}

goog.exportSymbol( 'example.sayHello', example.sayHello );

And this is the contents of hello-config.js:

{
    "id": "hello-plovr",
    "inputs": "hello.js",
    "paths": "."
}

Here are my build results (I threw in the Java version in case that matters):

C:\hello-plovr> java -jar plovr-0744c5209a34.jar build hello-config.js
JSC_MISSING_PROVIDE_ERROR. required "goog.dom" namespace never provided at hello.js line 2 : 12
BUILD FAILED: 1 Errors, 0 Warnings

I must be missing something trivial but I'm not seeing it.

In case it matters, this was run with Java 1.6.0_24:

C:\hello-plovr> java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

Solution

  • Use a newer version of plovr (April 2011 or later) OR don't use spaces in goog.require. Change hello.js, line 2 as follows:

    goog.require('goog.dom');  // NO SPACES
    

    Reported as a plovr bug here: http://code.google.com/p/plovr/issues/detail?id=37

    Plovr author suggests using closure-linter as it warns about whitespace issues:

    PS C:\hello-plovr> gjslint --strict hello.js
    ----- FILE  :  C:\hello-plovr\hello.js -----
    Line 4, E:0007: (New error) Should have 2 blank lines between top-level blocks.
    Line 5, E:0214: Missing description in @param tag
    Line 7, E:0001: Extra space after "("
    Line 7, E:0001: Extra space before ")"
    Line 8, E:0005: Illegal tab in whitespace before "goog.dom.getElement"
    Line 8, E:0001: Extra space after "("
    Line 8, E:0001: Extra space before ")"
    Line 9, E:0011: Missing semicolon after function assigned to a variable
    Line 11, E:0001: Extra space after "("
    Line 11, E:0001: Extra space before ")"
    Found 10 errors, including 1 new errors, in 1 files (0 files OK).
    
    Some of the errors reported by GJsLint may be auto-fixable using the script
    fixjsstyle. Please double check any changes it makes and report any bugs. The
    script can be run by executing:
    
    fixjsstyle --strict hello.js
    

    As indicated, the fixjsstyle utility (included when closure-linter is installed) can fix some errors but not all. One will probably need to do some hand editing. Here is a lint-compliant version of hello.js:

    goog.provide('example');
    goog.require('goog.dom');
    
    
    /**
     * @param {string} message A greeting message.
     */
    example.sayHello = function(message) {
      goog.dom.getElement('hello').innerHTML = message;
    };
    
    goog.exportSymbol('example.sayHello', example.sayHello);