Hi Flavio,

The "rootPath" is a global setting that affects all of Dropwizard's 
underlying servlets. You can set the "rootPath" to whatever path you want 
(e.g. "/api"), but then *all* resources will be under that rootPath, 
including resources served by Jersey (like your index.html) and by the 
AssetsBundle.

It's common for people to want to set the AssetsBundle to serve from a 
uriPath of "/" so that their static assets can be served from a path like 
"/js". Unfortunately, the root path "/" is already claimed by the Jersey 
servlet, so the AssetsBundle cannot also use it. It's a restriction of 
Dropwizard that each AssetsBundle needs its own uriPath, since each is 
built on its own servlet, and each servlet needs a unique URI path.

So you're going to need to put your assets under some URI path, like 
"assets":

    bootstrap.addBundle(new AssetsBundle("/assets/", "/assets/", 
"index.htm", "static"));

Then your static assets will be served there:

    http://example.com/rootPath/index.html
    http://example.com/rootPath/assets/js/jquery.js
    http://example.com/rootPath/assets/img/logo.png

Regards,
Doug

On Monday, July 10, 2017 at 10:26:08 AM UTC-4, Flavio Silveira wrote:
>
>
>
> sexta-feira, 7 de Julho de 2017 às 23:27:57 UTC-3, Flavio Silveira 
> escreveu:
>>
>>
>>
>> quinta-feira, 6 de Julho de 2017 às 19:29:41 UTC-3, Douglas Patriarche 
>> escreveu:
>>>
>>> Please see my responses inline below:
>>>
>>> On Wednesday, July 5, 2017 at 6:21:00 PM UTC-4, Flavio Silveira wrote:
>>>>
>>>>
>>>>
>>>> quarta-feira, 5 de Julho de 2017 às 18:57:22 UTC-3, Douglas Patriarche 
>>>> escreveu:
>>>>>
>>>>> Hi Flavio,
>>>>>
>>>>> Yes, that sounds like a sane structure for organizing assets. If you 
>>>>> are using Maven to manage your project, then your web-visible assets 
>>>>> should 
>>>>> be under the <project>/src/main/resources directory, e.g.:
>>>>>
>>>>> <project>/src/main/resources/assets/js
>>>>> <project>/src/main/resources/assets/css
>>>>> <project>/src/main/resources/assets/html
>>>>>
>>>>>
>>>>> You can then configure your application to serve static assets using 
>>>>> a ConfiguredAssetsBundle like this:
>>>>>
>>>>> public class MyApplication extends Application<MyAppConfiguration> {
>>>>>     // ...
>>>>>     @Override
>>>>>     public void initialize(final Bootstrap<MyAppConfiguration> 
>>>>> bootstrap) {
>>>>>         bootstrap.addBundle(new ViewBundle<>());
>>>>>         bootstrap.addBundle(new ConfiguredAssetsBundle("/assets/", 
>>>>> "/assets/", "index.html", "assets"));
>>>>>         bootstrap.addBundle(new ConfiguredAssetsBundle(
>>>>> "/META-INF/resources/webjars", "/webjars", "index.html", "webjars"));
>>>>>     }
>>>>>     // ...
>>>>> }
>>>>>
>>>>> You can configure multiple ConfiguredAssetsBundles, as seen above. The 
>>>>> second instance allows you to add WebJars <http://www.webjars.org> for 
>>>>> almost any JS/CSS library you might need.
>>>>>
>>>>> For a Metrics UI, I suggest you have a look at Grafana 
>>>>> <https://grafana.com> (for the UI) and Graphite 
>>>>> <https://github.com/graphite-project/graphite-web> (for the back-end 
>>>>> metrics service). To install Graphite, following the instructions here 
>>>>> <https://community.rackspace.com/products/f/25/t/6800>. Then install 
>>>>> Grafana, following the instructions here 
>>>>> <http://docs.grafana.org/installation/debian/>.
>>>>>
>>>>> I hope this helps.
>>>>>
>>>>> Regards,
>>>>> Doug
>>>>>
>>>>
>>>> Hi Douglas, thanks for your explanations!
>>>>
>>>> So the first line would be to tell Dropwizard that my resourcePath is 
>>>> /assets/, my uriPath is also /assets/, my indexFile is index.html and my 
>>>> assetsName is assets as seen here: 
>>>> https://github.com/dropwizard-bundles/dropwizard-configurable-assets-bundle/blob/master/src/main/java/io/dropwizard/bundles/assets/ConfiguredAssetsBundle.java#L173
>>>>
>>>> Is my assumption correct?
>>>>
>>>
>>> Yes, that's correct.
>>>  
>>>
>>>> About the second line, I would have to create directories 
>>>> /META-INF/resources/webjars inside /assets/ to have my webjars in 
>>>> /webjars/, again, am I following this through?
>>>>
>>>
>>> Actually, it's all taken care of for you, you don't need to do anything 
>>> other than create the ConfiguredAssetsBundle. With WebJars, the JS library 
>>> is packaged inside a jar file such that the static assets like .js and .css 
>>> files are stored inside the jar under the path 
>>> "/META-INF/resources/webjars". For example if you include JQuery in your 
>>> project:
>>>
>>>         <dependency>
>>>             <groupId>org.webjars</groupId>
>>>             <artifactId>jquery</artifactId>
>>>             <version>1.12.4</version>
>>>         </dependency>
>>>
>>> Then inside the jquery-1.12.4.jar the static assets are stored under the 
>>> path /META-INF/resources/webjars/jquery/1.12.4/... You can then load JQuery 
>>> in your web pages with:
>>>
>>>   <script src="/webjars/jquery/1.12.4/jquery.min.js"></script>
>>>
>>> The exact file names and paths inside the WebJars vary, so you'll want 
>>> to explore inside the jar files to see what exactly is available. Eclipse 
>>> allows you to easily look inside "Maven Dependencies" files; other IDEs 
>>> probably do too.
>>>  
>>>
>>>> In regards to Metrics UI, I have an idea for a Metrics UI that would be 
>>>> easily integrated to Dropwizard and maybe in the future be part of the 
>>>> bundle package, without depending on 3rd party software and its 
>>>> dependencies.
>>>> That's why I would like to know more about what is already there and 
>>>> where to see the possibility of extending and customizing it.
>>>>
>>>
>>> I think most people use Metrics by sending the metrics to an backend 
>>> server running Graphite or Ganglia or a commercial monitoring stack. 
>>> Graphite + Grafana is really good IMO. You can also access the raw metrics 
>>> as JSON if you access your app's adminConnector port with CURL or in a 
>>> browser. If you haven't looked at the adminConnector there are some basic 
>>> utilities available there:
>>>
>>> $ curl -G http://localhost:8986
>>> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>>>         "http://www.w3.org/TR/html4/loose.dtd";>
>>> <html>
>>> <head>
>>>   <title>Metrics</title>
>>> </head>
>>> <body>
>>>   <h1>Operational Menu</h1>
>>>   <ul>
>>>     <li><a href="/metrics?pretty=true">Metrics</a></li>
>>>     <li><a href="/ping">Ping</a></li>
>>>     <li><a href="/threads">Threads</a></li>
>>>     <li><a href="/healthcheck?pretty=true">Healthcheck</a></li>
>>>     <li><a href="/pprof">CPU Profile</a></li>
>>>     <li><a href="/pprof?state=blocked">CPU Contention</a></li>
>>>   </ul>
>>> </body>
>>> </html>
>>>
>>> It's pretty basic, though. It would certainly be nice if there was an 
>>> option, on development servers for example, to access the metrics in a 
>>> Grafana-like UI that was served directly by the Dropwizard-based app itself.
>>>
>>> Regards,
>>> Doug
>>>
>>>  Regards,
>>>
>>>>   Flavio Silveira
>>>>
>>>>
>>>>
>> Hi Douglas, thank you again for your quick reply!
>>
>> I've done some testing and from what I can see I cannot use "/" as 
>> uriPath, am I correct? 
>>
>> I've tried as below:
>>
>> public void initialize(final Bootstrap<PhoenixConfiguration> bootstrap) {
>>     bootstrap.addBundle(new AssetsBundle("/assets", "/", "index.htm"));
>> }
>>
>> and with that I get this error: Multiple servlets map to path /*: 
>> assets[mapped:JAVAX_API:null],io.dropwizard.jersey.setup.JerseyServletContainer-2c8662ac[mapped:EMBEDDED:null]
>>
>> From what I've searched it seems I need to move my application to another 
>> directory other than /, but I couldn't find the way of doing it in 1.1.2, 
>> on older versions it seems something 
>> like: environment.jersey().setUrlPattern("/api/*");
>>
>> My idea is to serve just index.htm (or index.html) like 
>> mydomain.com/index.htm and use /js/ for JavaScript files, /css/ for CSS 
>> etc. Can this be done? What did I miss?
>>
>> Regards,
>>   Flavio Silveira
>>
>
> Here is my last attempt but it is still giving me the error above:
>
> config.yml:
> -----------
> logging:
>   level: INFO
>   loggers:
>     br.com.tecnopon.phoenix: DEBUG
> server:
>   rootPath: /api/*
>
>
> PhoenixApplication.java:
> -----------
>
> public class PhoenixApplication extends Application<PhoenixConfiguration> {
>
>     public static void main(final String[] args) throws Exception {
>         new PhoenixApplication().run(args);
>     }
>
>     @Override
>     public String getName() {
>         return "Phoenix";
>     }
>
>     @Override
>     public void initialize(final Bootstrap<PhoenixConfiguration> 
> bootstrap) {
>         bootstrap.addBundle(new AssetsBundle("/assets", "/", "index.htm", 
> "static"));
>     }
>
>     @Override
>     public void run(final PhoenixConfiguration configuration,
>                     final Environment environment) {
>         final HelloWorldResource resource = new HelloWorldResource(
>                 configuration.getTemplate(),
>                 configuration.getDefaultName()
>         );
>         final TemplateHealthCheck healthCheck =
>                 new TemplateHealthCheck(configuration.getTemplate());
>         environment.healthChecks().register("template", healthCheck);
>         environment.jersey().register(resource);
>     }
>
> }
>

-- 
You received this message because you are subscribed to the Google Groups 
"dropwizard-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to