从头开始学Shark II

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

从头开始学Shark II –

启动引擎和登陆

(宏云翻译,Cygnet开源工作流组, 2005-4-15

原文地址:http://shark.objectweb.org/doc/sfs/sharkfromscratch2.html

在这篇文档中,我简单描述实例代码的创建。和以前一样,我不打算涉及和本文不直接相关的所有主题。首先,你必须了解如何去编写、编译和执行Java程序。另外,你需要有一个Shark的运行版,并且能够使用Shark提供的管理程序。

和以前一样,我已经安装了以下程序:

  1. MySQL –我使用 4.0.16 -nt

  2. MySQL Connector – 我使用mysql-connector-java- 3.0.11 -stable-bin.jar

  3. Ant 1.6.x – 不是必需的,但是我提供了一个build file....

  4. Java – 我使用Sun j2sdk version 1.4.2 _04

  5. CVS, Winzip, 等其他需要的软件。

在执行以下命令后,我的Shark build安装在C:/Shark目录下

        make -install

我使用的策略是重复构造一些类(class)来示范如何在Shark中广泛使用。接口是Main method之外的一个命令行。这样做的目的是让新用户可以很容易地开始,并舒适地为Shark进行编码。

文件

你可以阅读这些文件,并且点击指向源码的链接,它是通过Java2html Java2Html ( www.java2html.com )产生的。另外,我已经提供了源码和Ant Build文件。可以在这里找到它们here.

开始使用Shark

开始使用Shark如下所示一样简单:

         Shark.configure(new Properties("Shark.conf")); 

 

也就是说,首先要配置Shark (Shark from Scratch(从头开始学习Shark))。那么,你需要确保所有的Jar文件都是可用的。我们这里构建的代码并不在Shark目录下。

能够启动Shark的最小jar文件集合是(根据我的配置):

  • C:/Shark/lib/sharkkernel-standard.jar

  • C:/Shark/lib/sharkclientapi.jar

  • C:/Shark/lib/sharkcommonapi.jar

  • C:/Shark/lib/sharkinternalapi.jar

  • C:/Shark/lib/sharkxpdl-standard.jar

  • C:/Shark/lib/sharkinstancepersistence-dods.jar

  • C:/Shark/lib/dods-runtime.jar

  • C:/Shark/lib/util.jar

  • C:/Shark/lib/sharkutilities-dods.jar

  • C:/Shark/lib/mysql-connector-java- 3.0.11 -stable-bin.jar

  • C:/Shark/lib/sharkrepositorypersistence-dods.jar

  • C:/Shark/lib/sharkscripting-standard.jar

  • C:/Shark/lib/sharkutilities-map.jar

  • C:/Shark/lib/sharkutilities-misc.jar

  • C:/Shark/lib/xercesImpl.jar

  • C:/Shark/lib/xml-apis.jar

构建实例

因为代码量很小, 所以我把它列到这里,让大家可以深入了解。当然,同时我提供了所有的源代码和一个脚本文件,见here. 这个例子在first 包中可以找到。

运行"ant -p"来看一下目标达成情况。如果你不是使用c:/Shark作为你的安装目录, 你必须在你的构建脚本文件中改变shark.dir的属性值。我们运行的类叫 Simple

在运行之前,让我们来看看代码:

package first;
         
import org.enhydra.shark.Shark;

 

import java.util.Properties;
import java.io.FileInputStream;

 

/**
 * Does nothing more than start the Shark engine.
 */
public class Simple
{
   public static void main(String[] args)
   {
      try
      {
         Properties props = new Properties();
         props.load(new FileInputStream("C://Shark//Shark.conf"));

 

         System.out.println("Enginename from Shark.conf is : " + props.getProperty("enginename"));

 

         // Make SURE every instance of shark that connects to the same database uses a different
         // enginename.
         props.setProperty("enginename", "rross");

 

         Shark.configure(props);

 

      }
      catch (Exception e)
      {
         // It's not like I am going to revive the thing if it crashes...
         e.printStackTrace();
      }
   }
}

代码相当简单,它实现装载properties文件,提供一个不同的引擎名称并把属性对象传递给Shark

启动你的引擎

要运行它,只要在Dos命令中输入"ant runFirst"即可。当执行命令后,要看一下随后的输出

C:/dev/SharkFromScratch>ant runFirst
Buildfile: build.xml

 

runFirst:
     [java] Enginename from Shark.conf is : Shark
     [java] SharkEngineManager -> Shark engine is being initialized ...
     [java] File dodsConf.xml not exists on path: 'dodsconf' using default insted
     [java] Shark -> Initializing of shark engine has finished
     [java] Shark -> Initializing lasted 5 [s]
     [java] Shark -> firstEngine ready and waiting ...

 

BUILD SUCCESSFUL
Total time: 6 seconds

除了一个异常之外,其他都很正常。这个异常是“File dodsConf.xml not exists on path: 'dodsconf' using default insted"。忽略语法和拼写错误,就是说,不能找到dodsConf.xml的备份。如果我在Shark目录下做一个快速搜索,我能看到dodsConf.xml    确实存在。发生的问题是Shark.conf文件有一个缺省的相对路径,当你在包含build文件的目录(我这里是C:/dev/SharkfromScratch)下运行时,Shark能够找到所有的配置文件和其他信息。

修补配置文件

不是编辑硬盘上的Shark.conf文件,而是编辑在启动时传递给Shark引擎的各种属性。这使得我能够更好地控制什么会参与进来,使得我能够在应用(如runsa.bat)中继续使用“官方的(official)”Shark.conf文件,而不用经常改动它。

在交付给Shark之前,我会装载属性文件并预先考虑属性中所有相关文件名称的Shark安装目录。

second.Simple, 你能够看到上述情况。它并不是不可思议的,我已经硬编码了Shark的安装路径,它确实是完成了工作。

运行它,你会得到以下的输出(或者非常相似)

C:/dev/SharkFromScratch>ant runSecond
Buildfile: build.xml

 

runSecond:
     [java] Fixing up Shark config
     [java] SharkEngineManager -> Shark engine is being initialized ...
     [java] Shark -> Initializing of shark engine has finished
     [java] Shark -> Initializing lasted 5 [s]
     [java] Shark -> secondEngine ready and waiting ...

 

BUILD SUCCESSFUL
Total time: 6 seconds

正如你看到一样,Shark不再因为找不到dodsConf.xml文件而备受抱怨。在这一点上,我们正确启动了Shark

深入钻研Shark

既然我们能够启动Shark,让我们来看一下我们能够得到什么。Third包是我们第一次尝试构建一个程序。Workflow类提供一个称作init的方法,这个方法包含了到目前为止我们已经做的工作。

登录

下一步, 我们进行登录。实际上,我们要做的是获得一个SharkConnection对象,我们称作它的connect method. 这一代码片段来自login方法。

SharkConnection conn = Shark.getInstance().getSharkConnection();

 

try
{
   conn.connect(userName, password, props.getProperty("enginename"), null);
}

连接命令的第四个参数是’scope’,但是上次检查中我发现它没有和任何东西相连。在提供的build.xml文件中,使用"runThird",我们应改可以看到下面的结果。

C:/dev/SharkFromScratch>ant runThird
Buildfile: build.xml

 

runThird:
     [java] Fixing up Shark config
     [java] SharkEngineManager -> Shark engine is being initialized ...
     [java] Shark -> Initializing of shark engine has finished
     [java] Shark -> Initializing lasted 5 [s]
     [java] Shark -> thirdEngine ready and waiting ...

 

BUILD SUCCESSFUL
Total time: 6 seconds

你们可能注意到在登录的时候,系统没有提供新的信息。这很好,因为连接不是空的,且没有异常抛出,因此我们继续进行。

在调用recreateDB之后,这个新的数据库实际上还没有任何用户,注意到这一点是很重要的。如果你还没有这样做,你可以运行Shark Swing应用程序(我这里是C:/Shark/runsa.bat),并且使用用户名”admin”和密码"enhydra"登录。这样就会创建”admin”用户。实际上,如果你用未知的用户名登录Swing应用程序,它就会按照你提供的用户名和密码来创建一个新的用户

Classpaths

在提供的build.xml文件中,所有的目标具有相同的class path,但是正如你看到的那样,我前面已经进行了评议,以便你可以在任何点上,都能够判断需要什么文件。对于一个特定的安装来说,并不是Shark产生的所有文件都是必需的,因此,这会帮助你稍微整理一下你的class path.

 

从单例到依赖注入 这就是教科书式的 Service Locator:一个全局的、按类型查表的服务容器,谁需要谁自己去捞。就只依赖它真正用到的能力(接口隔离 ISP),依赖指向抽象(依赖倒置 DIP),而且你想塞个假的。——都从同一个字典里按类型捞实例,性能一样,对象也一样。判断该不该注入,别去问"能不能注入",要问的是"这个依赖需要被显性化和抽象化吗"。它有它的优点,这我不否认——简单、不用管线、随处可用。最理想的那种"初始化时注入",当然是构造函数注入。执行的时候,所有系统都注册完了,彼此拿引用是安全的。 阅读详情

相关推荐

用VASP计算GW+BSE

VASP在5.3以后的版本都能用解BSE方程的方法,在计算光吸收的过程中考虑激子效应。 下面就来写一个用BSE计算bulkSi的例子 首先,介电函数的计算是在GW计算的基础之上的。这里首先介绍G0W0的计算(我们这里直接在PBE的波函数基础上进行G0W0计算)。 1.PBE自恰计算,写WAVECAR System= Silicon groundstate occupied

ultra1989的专栏 2万+

Shark介绍及配置

Shark介绍及配置     翻译人:林勇                 QQ:313340285Email:showsscel@gmail.com   MSN:showsscel@hotmail.comSkype:showsscel    Shark介绍及配置 -- Enhydra Shark  2007年3月16日版本:1.0

4471

AI驱动视频剪辑自动化:cutcli命令行工具重塑工作流

视频剪辑自动化是提升内容生产效率的关键技术,其核心原理在于通过程序化指令替代手动操作,将创意执行过程代码化。这项技术的价值在于能够将创作者从重复性劳动中解放,实现批量化、标准化的视频内容生产,尤其适用于社交媒体运营、产品宣传等高频产出场景。通过封装专业软件(如剪映/CapCut)的底层草稿格式,自动化工具在保证工业级渲染质量的同时,提供了可编辑的中间态,为AI智能体(Agent)与生产工具的结合提供了清晰接口。本文以cutcli为例,深入探讨了如何通过命令行工具和AI助手,构建从自然语言指令到可编辑视频草稿

weixin_27210125的博客 1017

解决 Activiti UEL 表达式解析异常 TreeBuilderException

在Activiti工作流中,排他/包容网关条件表达式因嵌套${}导致UEL解析失败,抛出TreeBuilderException。根源在于UEL语法禁止表达式内再次使用${},且需避免XML特殊字符干扰。解决方案包括:移除内部定界符、使用CDATA包裹表达式、确保返回布尔值。建议通过正则扫描、IDE插件校验、编码规范(如单引号字符串、复杂逻辑外置)及测试验证,从源头预防此类问题。

小李同学的博客 483

JVM 垃圾回收机制详解:从标记过程、回收算法到垃圾收集器

本文系统梳理 JVM 垃圾回收机制,讲解堆内存分区、GC Roots 可达性分析,详解标记‑清除、复制、标记‑整理三大基础回收算法,对比 Serial、Parallel、CMS、G1、ZGC 多款垃圾收集器,分析各自优缺点与适用场景,帮助开发者吃透 GC 底层原理,理解内存管理,提升 Java 性能调优能力。

加油,量变引起质变 444

Java EE 进阶:3.SpringBoot 快速上手(第一弹):配置环境

Java EE 进阶:3.SpringBoot 快速上手(第一弹):配置环境

要努力去发光,而不是被照亮~ 278

基于Spring AI 的智能聊天机器人

该项目使用最新的Spring AI 2.0.x ,从零开始搭建智能体;文章提到有些代码可使用多种方式书写,这些不同的书写方式都是从Spring AI官方得来,自己也实践了。

Qq121363Aa的博客 165

[071][验证码模块]基于Spring拦截器的验证码认证设计思想

本文介绍基于Spring拦截器的验证码认证设计,通过@CaptchaAuth注解与CaptchaAuthHandlerInterceptor实现声明式验证码校验。结合工厂模式支持多类型验证码(图形、短信等),解耦业务逻辑,提升复用性与可扩展性。方案遵循单一职责与开闭原则,无侵入式集成Spring生态,配合全局异常处理器统一响应错误,适用于登录、支付等高安全场景。

杨运交的博客 348

jquick-pdf 核心原理解析:基于 HTML 模板动态渲染 PDF 的实现逻辑

六层链路是排错地图:读入、解析、变量绑定、布局与分页、渲染输出、结果返回,异常先分层再定位。二分删减是最实用的定位手段:先保留标题与一段文字,再逐项恢复表格、绑定值与分页节点。显式分页与自然分页必须分开回归;只是分页提示,不是绝对约束。适用边界与常见误区:jquick-pdf 位于“模板抽象”与“纯 Java 部署”之间,适合规则明确的业务文档,不适合依赖脚本与完整浏览器布局的页面;它与 iText、PdfBox 不是替代关系,后两者在底层控制上更强。

PaoHaiJiao的博客 550

Spring Boot 多数据源实战:让不同 Mapper 走不同数据源

适合需要运行时动态切换数据源的场景,比如读写分离、按租户切换。让不同 Mapper 走不同数据源,核心是让每个 Mapper 绑定到独立的 SqlSessionFactory。如果业务库之间完全独立、互不切换,推荐方案一,简单直观;如果需要运行时动态切换(如读写分离),推荐方案二。实际项目中也可以两者结合:静态分包 + 动态路由兜底。

KevinChen2019的博客 230

GitLab+Jenkins CI-CD自动化部署实战

本文记录了团队基于GitLab与Jenkins搭建CI/CD流水线的实战过程。通过制定Git Flow分支规范(如master/develop保护分支、MR审核机制),实现代码质量管控;利用Jenkins配置Git拉取、Maven构建、SSH部署及邮件通知,完成“推送即构建、构建即部署”的自动化流程。针对开发与生产环境采用不同触发策略(自动/手动),并集成备份与回滚脚本保障发布安全。全文涵盖环境搭建、插件配置、常见坑点及面试高频问题,为DevOps实践提供完整参考。

2301_78547133的博客 333

基于springboot+vue的生信息管理系统的设计与实现 源码+文档

本文分享基于SpringBoot3+Vue3的高校选课管理系统项目,涵盖管理员、教师、生多角色功能,实现课程管理、选课审批、成绩录入、考勤登记及通知公告等。技术栈为Vue3、ElementPlus、ECharts、SpringBoot3、MyBatis-Plus、SpringSecurity与MySQL。提供源码、数据库、万字文档、答辩PPT及部署指导,支持定制开发与持续技术答疑。获取方式见置顶链接(点我进入)。

大学生毕设选题 / 源码文档 → 置顶文章名片交流 260

de风——【从零开始C++】(二十)红黑树封装map和set

本文从零实现C++中set与map的封装,核心在于利用泛型与红黑树共用底层结构。通过KeyOfT仿函数统一比较逻辑,确保仅按key排序;借助const修饰使key不可修改,保障数据结构有序性;结合迭代器实现范围遍历,并通过Insert返回pair<iterator, bool>支持map的operator[]功能。最终完成mymap与myset的完整封装,揭示其本质为“红黑树+泛型外壳”,帮助新手彻底理解容器底层机制。

Xiao_running的博客 599

Java 编译、JDK 与 Android 构建入口

Android 项目中的 Java 源码先由 JDK 的 javac 编译成 class,AGP 在 Gradle 任务图里组织后续 Android 构建工作,D8 把字节码转成 dex 并打进 APK。安装后系统启动应用进程,ART 通过类加载器解析 APK 中的 dex,ActivityThread 在绑定应用时经 LoadedApk 和 Instrumentation 创建 Application。所以 Gradle 配置属于构建期,Application.onCreate() 属于运行期;R8 是否

trebleZ的博客 447

# Java文件打包成可执行JAR包(两种方式:原生javac\+jar命令 / Maven)

否则报错)

金玉满堂的博客 318

Collections常用方法(速查笔记)

Java Collections 是 java.util 包中的核心工具类,掌握高频用法可高效应对开发需求。常用包括:创建不可变集合(如 singletonList、emptySet)、包装只读或线程安全集合(如 unmodifiableList、synchronizedMap),以及排序、反转、打乱、二分查找等操作。注意:sort、reverse 等方法会修改原列表,使用时需谨慎,必要时先拷贝。建议结合官方 Javadoc 查阅方法摘要,提升编码效率与安全性。

qq_38980678的博客 339

Node.js 与 MCP:从 JavaScript 运行时到大模型的标准接口

大模型需通过运行环境与外部世界交互,Node.js 提供了脱离浏览器的 JavaScript 执行能力,实现前后端统一与快速开发。npm 与 npx 分别负责包管理与临时执行,为工具调用提供基础。而 MCP 协议则如 AI 的“USB-C”,以标准化接口打通模型与工具的连接,解决传统“硬编码”对接的复杂性,实现一次集成、处处可用,推动开放生态发展。

dev_jin的博客 222

01-06-A-JVM排查实战详解

本篇讲"**出事了怎么办**"——CPU 100%、内存泄漏、频繁 GC、线程死锁、堆外泄漏、容器被杀,六大现场的完整排查 SOP

hhkrye的博客 527

Spring Insight 里如何把 Span 收成一条链路

一次跨服务调用会留下多条 Span:Gateway 进站、Gateway 出站、order 进站、order 调 user、order 调 product……它们共享同一个traceId把树串起来。列表如果按 Span 展示,刷新一次能刷出几十上百行,其中很多是同一次下单。打开页面的人想找的通常是:刚才那次请求慢不慢、有没有 ERROR、入口是哪个服务。字段含义traceId这一次请求的 ID根 Span 所在服务,当作入口根 Span 的操作名startTime这棵树里最早的开始时间。

代码构筑系统,架构驱动未来 —— 一名深耕 Java 技术的实践者 258

Java面试汇总(持续更新中....)

面试回答: Java 是一门面向对象、静态强类型、跨平台的高级编程语言。它的核心设计理念是"一次编写,到处运行"(Write Once, Run Anywhere):源代码先由 javac 编译成与平台无关的字节码(.class 文件),再由对应操作系统上的 JVM 解释执行,因此同一份字节码可以在 Windows、Linux、macOS 等不同系统上运行,不需要重新编译。除了跨平台,Java 还有几个关键特点:① 自动内存管理——JVM 负责垃圾回收,程序员不需要像 C/C++ 那样手动 free;② 内

zm17671443092的博客 113

字段类型不一致:PostgreSQL 报错与索引失效的第一元凶

PostgreSQL 强类型特性导致字段类型不一致时,会直接报错(如 operator does not exist)或索引失效。核心问题在于表结构与 Java 实体/参数类型未严格对应,如 BIGINT 用 String 绑定、手机号用 Long 存储、时间字段拼接字符串等。此外,索引列上进行 cast、:: 等转换将导致索引无法命中。解决方案:实体字段与数据库类型一一映射,使用正确的 setXxx 方法绑定参数,避免列上类型转换,并通过 EXPLAIN 验证执行计划。牢记口诀:“实体类型对列型,列上转换

旺仔爱编程 342
上一篇: OBE用户指南(中文版)
macrocloud
博客等级 码龄22年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值