将速度加快到自己的个人代码生成器中
Speedment是一個開放源代碼工具箱 ,可用于生成Java實(shí)體和管理器以與數(shù)據(jù)庫進(jìn)行通信。 如果您需要域模型的對象關(guān)系映射,那么這很好,但是在某些情況下,您可能希望使用數(shù)據(jù)庫作為模板來生成完全不同的東西。 在本文中,我將向您展示一個hack,您可以使用該hack接管Speedment中的該代碼生成器并將其用于個人目的。 在文章的結(jié)尾,我們將有一個完全空白的代碼生成器,我們可以編程該代碼生成器來進(jìn)行投標(biāo)!
背景
Speedment旨在用作Maven的插件。 通過調(diào)用各種新的Maven目標(biāo),我們可以指示Speedment連接到數(shù)據(jù)庫,生成源代碼,并從我們的項(xiàng)目中刪除所有生成的文件。 它還包含一個圖形用戶界面,使您可以輕松地根據(jù)從數(shù)據(jù)庫中收集的元數(shù)據(jù)配置生成作業(yè)。 現(xiàn)在,想象一下我們可以通過分析該元數(shù)據(jù)收集的所有這些信息。 我們知道存在哪些表,知道它們具有的所有約束以及各個列具有什么類型。 可能有數(shù)百萬個用例,我們可以從這些用例自動生成內(nèi)容中受益。 按照本文中的步驟,我們可以做所有這些事情。
步驟1:建立定期加速項(xiàng)目
創(chuàng)建一個新的Maven項(xiàng)目并將以下內(nèi)容添加到pom.xml文件中:
pom.xml
<properties><speedment.version>3.0.1</speedment.version><mysql.version>5.1.39</mysql.version> </properties><dependencies><dependency><groupId>com.speedment</groupId><artifactId>runtime</artifactId><version>${speedment.version}</version><type>pom</type></dependency> </dependencies><build><plugins><plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency></dependencies></plugin></plugins> </build>我們添加了Speedment作為運(yùn)行時依賴項(xiàng),并配置了Maven插件以使用標(biāo)準(zhǔn)的MySQL JDBC驅(qū)動程序連接到我們的數(shù)據(jù)庫。 大! 現(xiàn)在,您可以訪問許多新的Maven目標(biāo)。 例如,如果我們要啟動Speedment UI,可以通過運(yùn)行以下命令來完成:
mvn speedment:tool如果我們現(xiàn)在這樣做,Speedment將以正常模式啟動,使我們能夠連接到數(shù)據(jù)庫,并從數(shù)據(jù)庫中生成實(shí)體和管理器,以使用Java 8流與該數(shù)據(jù)庫進(jìn)行通信。 這不是我們這次想要做的。 我們希望對其進(jìn)行修改,以使其完全滿足我們的要求。 因此,我們繼續(xù)修改pom。
步驟2:修改插件聲明
速度以模塊化的方式構(gòu)建,由不同的工件負(fù)責(zé)不同的任務(wù)。 所有預(yù)先存在的生成器任務(wù)都位于一個名為“ com.speedment.generator:generator-standard”的工件中。 那就是我們要罷工的地方! 通過從類路徑中刪除該工件,我們可以防止Speedment生成我們不希望的任何東西。
我們將pom修改如下:
... <plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Add this: --><dependency><groupId>com.speedment</groupId><artifactId>tool</artifactId><version>${speedment.version}</version><type>pom</type><exclusions><exclusion><groupId>com.speedment.generator</groupId><artifactId>generator-standard</artifactId></exclusion></exclusions></dependency></dependencies> </plugin> ...那是什么? 我們通過添加一個來排除依賴項(xiàng)? 那怎么能工作呢? 好吧,Speedment旨在包含盡可能少的代碼,除非應(yīng)用程序明確需要。 “ com.speedment:tool-artifact”已經(jīng)是maven插件的依賴項(xiàng),通過在maven插件的<dependencies>部分中提及它,我們可以將設(shè)置附加到其配置中。 在這種情況下,我們說我們希望插件可以訪問該工具,但我們不希望標(biāo)準(zhǔn)生成器。
但是這里有一個問題。 如果我們嘗試啟動speedment:tool目標(biāo),我們將獲得一個例外。 原因是Speedment 希望標(biāo)準(zhǔn)翻譯器位于類路徑中。
這是第二個丑陋的黑客入侵的地方。在我們的項(xiàng)目中,我們創(chuàng)建一個名為com.speedment.generator.standard的新程序包,并在其中定義一個名為StandardTranslatorBundle.java的新Java文件。 事實(shí)證明,這是Speedment真正需要工作的唯一文件。 我們?yōu)槠涮峁┮韵聝?nèi)容:
StandardTranslatorBundle.java
package com.speedment.generator.standard;import com.speedment.common.injector.InjectBundle; import java.util.stream.Stream;public final class StandardTranslatorBundle implements InjectBundle {@Overridepublic Stream<Class<?>> injectables() {return Stream.empty();} }接下來,我們需要用我們自己的項(xiàng)目替換排除的工件,以使插件永遠(yuǎn)不會意識到文件丟失。 我們返回到pom.xml文件,并將我們自己的項(xiàng)目添加到speedment-maven-plugin的<dependencies>部分。 完整的pom文件如下所示:
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.github.pyknic</groupId><artifactId>speedment-general-purpose</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><speedment.version>3.0.1</speedment.version></properties><dependencies><dependency><groupId>com.speedment</groupId><artifactId>runtime</artifactId><version>${speedment.version}</version><type>pom</type></dependency></dependencies><build><plugins><plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>com.speedment</groupId><artifactId>tool</artifactId><version>${speedment.version}</version><type>pom</type><exclusions><exclusion><groupId>com.speedment.generator</groupId><artifactId>generator-standard</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.github.pyknic</groupId><artifactId>speedment-general-purpose</artifactId><version>1.0.0-SNAPSHOT</version></dependency> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency></dependencies></plugin></plugins></build> </project>如果現(xiàn)在我們構(gòu)建項(xiàng)目,然后運(yùn)行target speedment:tool,我們應(yīng)該能夠毫無問題地啟動圖形用戶界面。 如果我們連接到數(shù)據(jù)庫,然后按“ Generate”,則什么也不會發(fā)生! 我們已經(jīng)成功地破解了Speedment,使其無所作為!
第3步:將速度變成您想要的東西
現(xiàn)在,當(dāng)我們有了全新的,干凈的Speedment時,就可以開始將其轉(zhuǎn)變?yōu)槲覀兿胍膽?yīng)用程序了。 我們?nèi)匀痪哂泄δ軓?qiáng)大的用戶界面,可以在其中基于數(shù)據(jù)庫模型配置代碼生成。 我們有一個富有表現(xiàn)力的實(shí)用程序和幫助程序類庫,用于處理生成的代碼。 最重要的是,我們擁有一種用于以面向?qū)ο蟮姆绞椒治鰯?shù)據(jù)庫元數(shù)據(jù)的結(jié)構(gòu)。
要了解有關(guān)如何編寫自己的代碼生成模板并將其掛鉤到平臺的更多信息, 請參閱本文 。 您還應(yīng)該查看Speedment GitHub頁面,以了解現(xiàn)有生成器(我們剛剛禁用的生成器)如何工作,并可能會啟發(fā)您如何構(gòu)建自己的生成器。
直到下次,繼續(xù)入侵!
翻譯自: https://www.javacodegeeks.com/2016/11/hack-speedment-personal-code-generator.html
總結(jié)
以上是生活随笔為你收集整理的将速度加快到自己的个人代码生成器中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动漫电脑壁纸吧(动漫电脑屏幕壁纸)
- 下一篇: 应用JDK 9 @不推荐使用的增强功能