热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于java:使用-Java-和-Maven-JBake-生成静态网站

咱们迁徙了整个www.optaplanner.org网站(1399个文件)以应用Java和Maven,而不是Ruby和Rake进行构建。从外表上看,什么都没有扭转。但在源代码中,对于咱们的Java开发人员团队来说,它是一个游戏规则扭转者。

应用 JBake(“mvn generate-resources”)构建您的动态网站或博客。应用布局、宏和数据文件。

咱们迁徙了整个www.optaplanner.org网站(1399 个文件)以应用 Java 和 Maven,而不是 Ruby 和 Rake 进行构建。从外表上看,什么都没有扭转。但在源代码中,对于咱们的 Java 开发人员团队来说,它是一个游戏规则扭转者。

咱们的 Java 团队当初能够轻松地为网站做出奉献。在实现迁徙后的几个小时内,咱们的一位开发人员曾经提交了一份不违心用十英尺长的杆子接触以前的源代码的提交。

咱们建设了这个网站。
咱们在 Java 和 Maven 上构建了这个站点。
咱们建设了这个网站。
咱们在 JBake 和 Freemarker 上建设了这个网站。

为什么应用动态网站生成器?

动态网站生成器将模板和内容文件转换为动态 HTML/JS/CSS 网站。对于咱们这样的我的项目,这比内容管理系统 (CMS) 有很多劣势:

托管很便宜。GitHub 页面甚至收费托管动态网站。

源文件进入 Git 进行备份和历史记录。

源文件为纯文本格式:

更改以拉取申请的模式呈现,以进行适当的审查和 CI 验证。

源代码在咱们的 IDE 中是凋谢的,这激励将它们与代码一起重构。这会缩小古老的内容。

多年来,Awestruct 始终为咱们服务。但因为不足流动,是时候降级了。

为什么是 JBake?

因为咱们是 Java 程序员。

有几个很好的动态网站生成器,比方 Jekyll (Ruby) 和 Hugo (Go)。咱们抉择JBake (Java),因为:

咱们的网站当初应用 Maven ( mvn generate-resources)构建。

无需装置任何货色。甚至不是 JBake。每个人都应用雷同版本的 JBake 构建,如pom.xml.

而且速度很快:即便mvn clean在我的机器上构建 150 个输入页面也只须要 20 秒。

.上面全是Java。

编写条件表达式很简略。API ( String.substring(), …) 很相熟。日期格局 ( d MMMM yyyy) 和正则表达式的行为合乎预期。

最重要的是,谬误音讯很分明。

8 年来,我用 Awestruct (Ruby) 编写了这个网站。但我素来没有花工夫好好学习 Ruby,所以每次扭转都须要数小时的重复试验。我不能只是浏览谬误音讯并修复它。这不是鲁比的错。那是因为我素来没有花几天工夫来真正学习 Ruby。应用 JBake,我能够在很短的工夫内修复谬误:不再须要重复试验。

什么是 JBake?

JBake 是一个动态网站生成器,有很多选项:

应用 Maven 或 Gradle 构建。

咱们抉择Maven,因为咱们所有的 repos 都是用 Maven 构建的(只管两个OptaPlanner Quickstarts也用 Gradle 构建,因为 OptaPlanner 也反对 Gradle)。

用 Asciidoc、Markdown 或 HTML 编写内容。

咱们抉择Asciidoc是因为它比 Markdown更丰盛、更牢靠。此外,咱们所有的文档都是用 Asciidoc 编写的。

应用 Freemarker、Thymeleaf 或 Groovy 创立模板。

咱们抉择Freemarker是因为它是一个弱小的、通过实战考验的模板引擎。

技巧和诀窍

这些是构建高级动态网站的常见工作以及如何在 JBake-Freemarker 中实现每个工作。您甚至能够将这些JBake 设计模式称为:

应用宏渲染共享内容

咱们简直所有的模板都显示雷同的最新版本面板:

最新公布

Freemarker 模板非常适合防止反复本人 (DRY):
templates/macros.ftl应用输入 HTML 的宏创立:

<#macro latestReleases>
    
Latest release
...

而后在*.ftl模板中应用它:

<#import "macros.ftl" as macros>
...
...
<@macros.latestReleases/>

应用数据文件增加视频、事件或其余易失性数据

某些数据更改过于频繁,无奈在内容或模板文件中进行保护:

一个数据文件,例如一个简略的*.yml文件,能够很好地保留这样的易失性数据:

创立data/videos.yml:

- youtubeId: blK7gxqu2B0
title: "Unit testing constraints"
...

- youtubeId: gIaHtATz6n8
title: "Maintenance scheduling"
...

- youtubeId: LTkoaBk-P6U
title: "Vaccination appointment scheduling"
...

而后在ftl模板中应用它:


<#assign videos = data.get('videos.yml').data>

Latest videos

布局继承

所有 HTML 页面通常共享雷同的 HTML 头(元数据)、页眉(导航)和页脚。这些非常适合base.ftl布局,由所有其余模板扩大:

只管大多数内容应用normalBase.ftl,但useCaseBase.ftl所有用例页面都有独自的模板,例如车辆路线问题 (VRP)、保护打算和轮班排班。

应用带有 的宏<\#nested>来构建布局继承:

创立templates/base.ftl:


<#macro layout>
    
        
          ...
        
        
            
... <#-- header -->
<#nested>
... <#-- footer -->

扩大它templates/useCaseBase.ftl并引入自定义属性related_tag:


<#import "base.ftl" as parent>

<@layout>${content.body}

<#macro layout>
    <@parent.layout>
        

${content.title}

<#nested>

Related videos

<#assign videos = data.get('videos.yml').data> <#assign relatedVideos = videos?filter(video -> video.tags.contains(content.related_tag))>

创立content/vehicleRoutingProblem.adoc应用该模板并设置该related_tag属性的用例页面:


= Vehicle Routing Problem
:jbake-type: useCaseBase
:jbake-related_tag: vehicle routing

The Vehicle Routing Problem (VRP) optimizes the routes of delivery trucks,
cargo lorries, public transportation (buses, taxi's and airplanes)
or technicians on the road, by improving the order of the visits.
This routing optimization heavily reduces driving time and fuel consumption compared to manual planning:

...

开始
本人试试吧。要构建www.optaplanner.org网站,请运行以下命令:

$ git clone https://github.com/kiegroup/o&#8230;
&#8230;
$ cd optaplanner-website
$ mvn clean generate-resources
&#8230;
$ firefox target/website/index.html
或者看看源代码。


推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
author-avatar
西安黄河文化补习学校
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有