前言

你没有看错,我确实在.Net6的项目中在编写java,我都using java了,算不算在写java那?

using com.microsoft.sqlserver.jdbc;
using java.sql;

并且编辑器还带提示的功能

这一切都是借助IKVM来实现的,或许有些人还听说过使用IKVM的CLI命令来转换jar包,比如使用Bing搜索:ikvm转换jar包为dll ,但是这个过程我是没有经历的,现在的使用方法更省事了

IKVM是什么?

从GitHub摘抄说明:IKVM 是 Microsoft .NET 平台的 Java 实现。它可用于快速轻松地:

  • 在 .NET Framework 或 .NET Core 上执行已编译的 Java 代码(字节码)
  • 将字节码转换为 .NET 程序集,以在 .NET 项目中直接访问其 API

无需将源代码移植到 .NET 即可完成这些任务。

GitHub地址:https://github.com/ikvmnet/ikvm

插播资讯

这里插播一个看到的资讯,没想到吧,中间居然夹带私货

都夹带私货了,那发个福利吧,地址放这里吧:http://www.loongnix.cn/zh/api/dotnet/

用法

直接引用jar包

例如我们有一个netjar.jar包想将其引入到项目中,那么我们可以在项目中创建一个jar的文件号,然后将netjar.jar文件放进去,然后修改项目文件

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup> <ItemGroup>
<PackageReference Include="IKVM" Version="8.2.1" />
</ItemGroup> <ItemGroup>
<IkvmReference Include="jar/netjar.jar" >
<AssemblyName>netjar</AssemblyName>
<AssemblyVersion>1.0.0.4</AssemblyVersion>
</IkvmReference>
</ItemGroup> </Project>

.csproj 中添加 IkvmReference , 再添加 Include 为 jar/netjar.jar,并指定 AssemblyName 编译后的 就是 netjar.dll ,AssemblyVersion 必须是 1.0.0.0 这种 4位数的版本号会给dll加上版本信息

IkvmReference的说明:https://github.com/ikvmnet/ikvm#attributes-and-elements

Maven源引用

推荐一个maven源给跟我一样不会java的.Net开发者:https://mvnrepository.com/

项目中可以使用阿里云的源:https://maven.aliyun.com/nexus/content/groups/public/

对比直接引用的方法,我们需要多安装一个IKVM.Maven.Sdk的Nuget包,默认是有一个Maven源的,然后我们只需要修改.csproj项目文件进行配置MavenReference即可

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup> <ItemGroup>
<PackageReference Include="IKVM" Version="8.7.1"/>
<PackageReference Include="IKVM.Maven.Sdk" Version="1.6.1"/>
</ItemGroup> <ItemGroup>
<MavenReference Include="mssql-jdbc">
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre8</version>
</MavenReference> <!-- <MavenReference Include="com.microsoft.sqlserver:mssql-jdbc" Version="12.4.2.jre8" />-->
</ItemGroup> </Project>

使用说明:https://github.com/ikvmnet/ikvm-maven#readme

其中MavenReference内容可以参考上面的maven源搜索出来的内容,比如:https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc/12.4.1.jre8

设置自定义源

默认已经包含了源,也可以通过修改项目文件来设置自定义源,这里我设置了阿里云的源:https://maven.aliyun.com/nexus/content/groups/public/

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <MavenDefaultRepositories Condition="'$(MavenDefaultRepositories)' == '' ">central=https://maven.aliyun.com/nexus/content/groups/public/</MavenDefaultRepositories>
<MavenRepositories Condition=" '$(MavenRepositories)' == '' ">$(MavenDefaultRepositories);$(MavenAdditionalRepositories)</MavenRepositories>
</PropertyGroup>

操作示例

使用hutool序列化对象

下面演示调用java序列化的jar包来序列化(仅为了演示效果),新建项目(此处我使用的是.Net6框架的项目),引用nuget包

<ItemGroup>
<PackageReference Include="IKVM" Version="8.6.4" />
<PackageReference Include="IKVM.Maven.Sdk" Version="1.5.5" />
</ItemGroup>

引用mvaen的包,修改项目文件如下

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <MavenDefaultRepositories Condition="'$(MavenDefaultRepositories)' == '' ">central=https://maven.aliyun.com/nexus/content/groups/public/</MavenDefaultRepositories>
<MavenRepositories Condition=" '$(MavenRepositories)' == '' ">$(MavenDefaultRepositories);$(MavenAdditionalRepositories)</MavenRepositories>
</PropertyGroup> <ItemGroup>
<PackageReference Include="IKVM" Version="8.6.4" />
<PackageReference Include="IKVM.Maven.Sdk" Version="1.5.5" />
</ItemGroup> <ItemGroup>
<MavenReference Include="cn.hutool">
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.6</version>
</MavenReference>
</ItemGroup> </Project>

序列化对象

using cn.hutool.json;

var userInfo = new UserInfo { UserName = "admin", Password = "123456" };

var result = JSONUtil.toJsonStr(userInfo);
Console.WriteLine(result); public class UserInfo
{
/// <summary>
/// 用户名
/// </summary>
public string UserName; /// <summary>
/// 密码
/// </summary>
public string Password;
}

使用jdbc连接sqlserver2008

该示例是当时连接sqlserver2008一直报错(数据库版本太低了),java组那边说他们连接不报错,所以想操作试试搞的

新建一个.Net6的控制台项目,然后引用nuget包(IKVM.Maven.Sdk是使用maven源用到的,直接引入jar包可以不安装)

<ItemGroup>
<PackageReference Include="IKVM" Version="8.7.1"/>
<PackageReference Include="IKVM.Maven.Sdk" Version="1.6.1"/>
</ItemGroup>

这个时候就需要找一个连接数据库的包,经过搜索后可以使用mssql-jdbc(也可以采用直接下载jar包放到项目目录内的方法,不使用maven),那么可以引入一下

<ItemGroup>
<MavenReference Include="mssql-jdbc">
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre8</version>
</MavenReference> <!--简化写法-->
<!--<MavenReference Include="com.microsoft.sqlserver:mssql-jdbc" Version="12.4.2.jre8" />-->
</ItemGroup>

这时候如果项目生成不报错了,那么说明包等下载好、引用好了,开始编写代码,代码虽然简单,但是还是花费了一番功夫的

try
{
var url = "jdbc:sqlserver://192.168.1.50:1433;DatabaseName=manage;Encrypt=false";
var userName = "sa";
var pwd = "admin123";
DriverManager.registerDriver(new SQLServerDriver());
var connection = DriverManager.getConnection(url, userName, pwd);
var stmt = connection.createStatement();
var rs = stmt.executeQuery("select @@version");
while (rs.next())
{
Console.WriteLine(rs.getString(1));
} Console.WriteLine("conn success");
}
catch (Exception ex)
{
Console.WriteLine($"message:{ex.Message} stackTrace:{ex.StackTrace}");
}

经过我的瞎蒙以及查阅资料终于写出来了上面查询数据库版本号的代码,然后启动项目查看输出

测试一下容器部署,选中项目右键新建dockerfile文件如下(默认生成的)

FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["JavaConsoleApp/JavaConsoleApp.csproj", "JavaConsoleApp/"]
RUN dotnet restore "JavaConsoleApp/JavaConsoleApp.csproj"
COPY . .
WORKDIR "/src/JavaConsoleApp"
RUN dotnet build "JavaConsoleApp.csproj" -c Release -o /app/build FROM build AS publish
RUN dotnet publish "JavaConsoleApp.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "JavaConsoleApp.dll"]

虽有警告,但是可以正常连接

这里不得不说,他这组件要求还怪宽松,看过我上个文章的人就知道,我使用.Net组件连接sqlserver2008(甲方的数据库,版本低还不能升级)还需要再dockefile中配置其它。

参考资料

maven文档:https://github.com/ikvmnet/ikvm-maven

java操作数据库:https://blog.csdn.net/qq_37917691/article/details/108262286

在.Net中使用Java代码?的更多相关文章

  1. Myeclipse中把java代码导成UML类图

    Myeclipse中把java代码导成UML类图 1.右键点击项目名称,选择New-------àUML2 Model 2.给类图命名 3.导成类图 1)如果要把整个项目导成类图,则把整个项目拖到类图 ...

  2. jsp页面中的java代码

    jsp页面中的java代码 1.jsp表达式  <%= ....%>  只能放置一个变量常量 2. jsp小脚本 <% .... %>  java语句,可以插入一些语句 3. ...

  3. JSP中嵌入java代码方式以及指令

    JSP中嵌入java代码的三种方式: (1)声明变量或方法 :  <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet):  <% j ...

  4. android中在java代码中设置Button按钮的背景颜色

    android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...

  5. MyEclipse中阿里JAVA代码规范插件(P3C)的安装及使用

    JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...

  6. eclipse中添加Java代码注释模板

    eclipse中添加Java代码注释模板 1.Window->Preference->Java->Code Style->Code Template,进入注释编辑界面 2.文件 ...

  7. EL和 JSTL? 在JSP中简化 java代码的写法!

    一.servlet部分 package com.aaa.servlet; import com.aaa.dao.IStudentDAO; import com.aaa.dao.Impl.Student ...

  8. IDEA中阿里JAVA代码规范插件(P3C)的安装及使用

    JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...

  9. 在Eclipse中运行JAVA代码远程操作HBase的示例

    在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ...

  10. JSP中的Java代码和内置对象

    一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...

随机推荐

  1. js判断一个时间是否在某一个时间段内

    很多时候,我们需要对时间进行处理: 比如说:获取当前的时间 判断某一个时间是否在一段时间内:如果在显示出某一个按钮: 让用户可以操作:如果不在,按钮隐藏 这个时候,我们就需要对时间进行处理了 < ...

  2. 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...

  3. Abp 模板更换数据库 版本为V5.x,遇到的问题

    数据库的选择: Mysql使用5.0.0的版本,根据在下面的依赖项 大于等于5.0.5 && 小于6.0.0 Microsoft.EntityFrameworkCore.Tools和M ...

  4. ElasticSearch实战指南必知必会:安装分词器、高级查询、打分机制

    ElasticSearch实战指南必知必会:安装中文分词器.ES-Python使用.高级查询实现位置坐标搜索以及打分机制 1.ElasticSearch之-安装中文分词器 elasticsearch ...

  5. C++ 基于Boost.Asio实现端口映射器

    Boost.Asio 是一个功能强大的 C++ 库,用于异步编程和网络编程,它提供了跨平台的异步 I/O 操作.在这篇文章中,我们将深入分析一个使用 Boost.Asio 实现的简单端口映射服务器,该 ...

  6. C/C++ x64 Inline Hook 代码封装

    Hook 技术常被叫做挂钩技术,挂钩技术其实早在DOS时代就已经存在了,该技术是Windows系统用于替代DOS中断机制的具体实现,钩子的含义就是在程序还没有调用系统函数之前,钩子捕获调用消息并获得控 ...

  7. 《Mybatis 手撸专栏》第2章:创建简单的映射器代理工厂

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 着急和快,是最大的障碍! 慢下来,慢下来,只有慢下来,你才能看到更全的信息,才能学到 ...

  8. Exception message: CreateSymbolicLink error (1314): ???????????

    window下运行任务报错:Exception message: CreateSymbolicLink error (1314): ??????????? 报错信息如下: Diagnostics: E ...

  9. 俄大神 lopatkin Windows 精简优化系统 - 工具软件

    昨天有个网友邮件我,说是想找个Tiny7 Rev2的ISO操作系统文件,但是我找了下,以前的那些文件有些已经删除了,所以就在网上搜到了俄大神 lopatkin Windows 精简优化系统,特此放到网 ...

  10. Delphi 字符串截取函数【LeftStr,RightStr,MidStr】

    如果要使用LeftStr,RightStr,MidStr必需引用系统单元StrUtils; 声明变量Str:string; Str:=HelloWorld; 1,LeftStr(Str,2)=He;/ ...