小编jwa*_*jwa的帖子

从Java接口生成Typescript接口

我有一个Java服务器应用程序,它使用Jackson通过反射API一般地序列化DTO.例如,对于此DTO界面:

package com.acme.library;
public interface Book { 
  com.acme.library.Author getAuthor();
  String getTitle();
}
Run Code Online (Sandbox Code Playgroud)

从这个界面的POJO实现,Jackson将一般序列化以下实体:

{
   "author": { "name": "F. Scott Fitzgerald"},
   "title": "The Great Gatsby"
}
Run Code Online (Sandbox Code Playgroud)

将使用我的TypeScript应用程序(基于AngularJS)的HTTP GET接收此有效负载:

$http.get("http://localhost/books/0743273567")
   .success((book: Book) => { ... });
Run Code Online (Sandbox Code Playgroud)

因此我能够使用TypeScript的强类型性质,我发现自己手工编写以下的typescript接口:

module com.acme.library {
  export interface Book {
      author: com.acme.library.Author;
      title: String;
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,我必须保留这个相同界面的两个副本 - 这最多是麻烦的.这变得特别讨厌,因为我想在两个接口上都有相同的javadoc/jsdoc注释,这涉及整个复制和粘贴堆.


我想找到一种自动化这个过程的机制.

Java是我的主要开发语言.因此,我想找到一些能够从Java接口声明(通过反射API?)转换到相关TypeScript接口的工具.

我在这个领域发现的唯一工具是NPM包ts-java.但是,这对我的用例来说太重了.它增加了从对象层次结构的方法给每个接口,例如hashCode(),wait(),getClass()等.

java typescript

25
推荐指数
2
解决办法
1万
查看次数

将Selenium Server和ChromeDriver作为Windows服务运行

因此,我们可以执行从前到后的Web UI测试,我们使用Selenium和ChromeDriver自动化页面加载/交互作为我们测试包的一部分.

这在开发人员测试期间(在开发人员的本地计算机上)表现得如预期,但我们正在努力执行这些检查,作为我们持续集成构建的一部分.

我们的服务器工厂基于*NIX,我们所有的CI基础设施都在这些机器上运行.因此我们可以在Windows(我们的交付机制)下测试Chrome,我们已经配置了Selenium Grid.当CI测试运行时,他们访问网格,以便找到运行测试的Windows节点.

我们已经配置了Windows桌面,仅用于运行这些测试.这包含我们标准的Windows 7企业版本.该机器将定期重新启动,与IT部门的更新策略一致.

为了确保Selenium服务器始终运行,我们将Selenium Server(以"节点"模式运行)添加为Windows服务.selenium Server配置为启动ChromeDriver以调用模拟的用户交互.

但是,从CI运行测试时,由于超时而失败.我们的工作原理是,运行服务的系统用户无法创建交互式窗口.网络搜索引发了对"会话0"问题的引用,但对如何向前推进几乎没有建设性意见.

从交互式会话手动启动Selenium Server进程不是一个可行的解决方案,因为这会导致脆弱的测试 - 由于基础结构问题导致测试失败,而不是真正的测试回归.


每当系统重新启动时,我们如何通过Windows服务启动Selenium Server实例,该实例能够启动Chrome实例?

selenium webdriver selenium-webdriver

14
推荐指数
3
解决办法
2万
查看次数

NPM持续集成的最佳实践

我正在使用基于NPM的工具(grunt)构建HTML5前端.

我的持续集成构建过程的第一步是运行一个npm install.

npm install.即使使用本地NPM代理缓存工件(Sonatype的Nexus 3),它仍然需要4分钟!

$> time npm install
real    4m17.427s
user    0m0.170s
sys     0m0.290s
Run Code Online (Sandbox Code Playgroud)

如果我按照通常的最佳实践进行持续集成,我将从一个原始的SCM存储库开始并运行构建.这意味着每次CI构建都必须重新开始npm install并承担4分钟的费用.

这是一个显著的我的编译时间比例.我不满意构建需要这么长时间.


替代方案似乎是node_modules在构建之间保持一致.但是,我遇到了构建变得不稳定的问题.

删除依赖项package.json并不会node_modules简单地删除它们npm install.我可以用npm prune第一个来解决这个问题.

什么被认为是最佳做法?

npm

9
推荐指数
1
解决办法
816
查看次数

Maven,Lombok和Eclipse - 有意义的整合模式

所以,我一直想要使用Lombok一段时间 - 我终于开始了一个我可以使用它的项目.需要注意的重要一点是,这将是一个大型的企业级应用程序,因此使用的集成模式必须是有意义的,尽可能少的黑客攻击.

所以我看了一下lombok-maven-plugin和整个delombok软糖.我知道这将复制我的所有代码,并扩展现有的lombok注释.这给了我第二组生成的.java文件,这些文件需要在编译期间由maven使用.

但是,通过生成这些新的源文件 - eclipse会选择它们并尝试将它们引入我的项目中.因此,它会触发关于重复类的一百万(OK,轻微夸大)错误.

一些解决方案建议我改变<sourceDirectory>我的POM.这会让事情变得更好,因为mvn eclipse:eclipse现在src/main/java将从项目中完全省略我的java目录 - 只显示delombok进程的输出.

然后提出我需要使用一个配置文件来编译/打包项目,以及另一个配置文件mvn eclipse:eclipse.这不是一个可接受的解决方案,因为我不得不花费足够的时间来维护/解释我已经很复杂的maven设置 - 而不必引入一个全新的配置文件(除了我现有的配置文件).

我希望有一些灵感可以让我免于为我的项目写下Lombok.这是一个减少样板代码的好工具,但它似乎还没有为黄金时段的企业使用做好准备 - 我觉得非常令人失望:-(

以下是我目前的POM:

<build>
    <sourceDirectory>target/generated-sources/delombok</sourceDirectory>
    <testSourceDirectory>target/generated-test-sources/delombok</testSourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.12.2.0</version>
            <dependencies>
                <dependency>    
                    <groupId>sun.jdk</groupId>
                    <artifactId>tools</artifactId>
                    <version>1.7</version>
                    <scope>system</scope>
                    <systemPath>${java.home}/../lib/tools.jar</systemPath>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>delombok</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>delombok</goal>
                    </goals>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <addOutputDirectory>false</addOutputDirectory>
                        <sourceDirectory>src/main/java</sourceDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>test-delombok</id>
                    <phase>generate-test-sources</phase>
                    <goals>
                        <goal>testDelombok</goal>
                    </goals>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <addOutputDirectory>false</addOutputDirectory>
                        <sourceDirectory>src/test/java</sourceDirectory>
                    </configuration> …
Run Code Online (Sandbox Code Playgroud)

java eclipse maven lombok

8
推荐指数
2
解决办法
7280
查看次数

通用项目的"裸"Eclipse安装

我的团队成员将处理许多纯文本文件.我不想使用普通的文本编辑器,而是希望他们使用eclipse,因此我们可以利用插件来简化生活......例如svn插件.

因此,我想为他们提供Eclipse的安装,他们将在那里设置通用项目,而不是Java项目.

但是,从网站上下载的基本Eclipse包括所有java功能.这意味着他们的GUI充斥着不需要的与java相关的功能,我真的不希望他们使用它们.

我试图从安装中删除JDT插件/功能,但此时通用项目功能也消失了!

如何在保留通用项目功能的同时去除java功能?

eclipse

6
推荐指数
1
解决办法
1765
查看次数

使用单击事件处理程序防止routerLink更改路由

我的角应用包含有一个锚标记routerLinkclick与之相关的处理程序:

<a [routerLink]="/abc" (click)="onClick"> </a>
Run Code Online (Sandbox Code Playgroud)

我想routerLink在用户右键单击并选择"在新标签页中打开"时使用.

click如果用户只需左键点击的链接处理程序应被触发.在这种情况下,我希望routerLink触发路由更改.

在我的点击处理程序中,我尝试中止点击事件,即

public onClick(event: MouseEvent): {
    // Was hoping this would do it...
    event.preventDefault();
    // .. clutching at straws
    event.stopPropagation();
    // .. oh dear oh dear. Still not working
    event.stopImmediatePropagation();
}
Run Code Online (Sandbox Code Playgroud)

这些都不会妨碍routerLink激活和导航新路线/abc.如何让我的click处理程序阻止routerLink被解雇?

angular2-routing angular

6
推荐指数
1
解决办法
1083
查看次数

网站列出Maven传递依赖关系

在我的组织内部,我受到IT安全机构的严格监管.因此,禁止所有访问maven镜像.但是,我可以提供我需要的依赖项的详细信息,以便IT安全人员可以执行其检查/扫描,并希望为我下载二进制文件.

然后我在我的本地maven repo中安装这些,这意味着它们可以在防火墙内免费提供给我的团队.

maven的美妙之处在于它可以识别和下载传递依赖.但是,如果无法访问外部POM文件,我无法通过maven dependency:tree执行这些检查.

因此,我必须一次一个地向IT部门提供依赖项.鉴于某些依赖链的深度,这可能需要相当长的时间才能回归/转发IT.或者,我在家里做依赖:树,并自己邮寄结果.

我想知道是否有人对我可以查询此信息的网站有任何建议?所以,如果我想(比如)log4j:1.2.17,它会告诉我我还需要请求javax.mail:mail:1.4.3.

maven

5
推荐指数
1
解决办法
74
查看次数

"commons-math"式BigDecimal/BigInteger的实现

我正在寻找有关第三方库的建议,用于对BigDecimal/BigInteger中编码的数字进行统计分析.

Apache commons-math包含所有理想的功能(它是DescriptiveStatistics和SummaryStatistics)......但它使用的是双打而不是BigXXX实现.

由于对我的软件精度的监管要求,我需要使用BigXXX实现.但是我非常希望不要自己实现我需要的基本统计数据.

例如,编写我自己的中值算法很容易 - 但是拾取高精度数据类型似乎违反直觉,然后使用我自己的不成熟(因此,可能是错误的)方法来执行它们的统计.

java statistics biginteger bigdecimal apache-commons-math

5
推荐指数
0
解决办法
1061
查看次数

用于将 java 对象序列化为固定宽度字节数组的库

我想以二进制格式存储一个非常简单的 pojo 对象:

public class SampleDataClass {
    private long field1;
    private long field2;
    private long field3;
}
Run Code Online (Sandbox Code Playgroud)

为此,我编写了一个简单的序列化/反序列化方法对:

public class SampleDataClass {

    // ... Fields as above        

    public static void deserialize(ByteBuffer buffer, SampleDataClass into) {
        into.field1 = buffer.getLong();
        into.field2 = buffer.getLong();
        into.field3 = buffer.getLong();
    }

    public static void serialize(ByteBuffer buffer, SampleDataClass from) {
        buffer.putLong(from.field1);
        buffer.putLong(from.field2);
        buffer.putLong(from.field3);
    }
}
Run Code Online (Sandbox Code Playgroud)

简单高效,最重要的是二进制格式的对象大小是固定的。我知道序列化的每条记录的大小将是 3 x 长,即 3 x 8 字节 = 24 字节。

这是至关重要的,因为我将按顺序记录这些,稍后我需要能够通过索引找到它们,即“找到我第 127 条记录”。

This is working fine for me, but I …

java serialization deserialization

5
推荐指数
1
解决办法
1789
查看次数

识别Java jdwp Debugger Assigned(Ephemeral)端口

我使用以下JVM参数来启动主机调试程序的JVM.

-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0
Run Code Online (Sandbox Code Playgroud)

请注意,我正在分配端口零,以便JVM向操作系统请求临时端口.这对我的用例至关重要,以确保JVM不会因为某些预定义端口的争用而无法启动.

结果我的JVM启动,并将以下日志条目输出到stdout:

Listening for transport dt_socket at address: XXXX
Run Code Online (Sandbox Code Playgroud)

我想找到一些方法来识别JVM内部或外部的调试端口,因此我可以将它记录在状态管理服务器中.

这个用例有哪些选择?我已经考虑了以下几点,但没什么乐趣:

  • JMX Connector - 使用JConsole连接到进程,找到一些详细说明使用哪个端口的MBean.但是,我找不到任何这样的MBean
  • RMI注册表 - 是否可以让调试代理自己注册RMI注册表?我没有找到任何可行的证据.
  • Java代理 - 指定可以拦截调试器某些方面并获取端口详细信息的JVM代理,再次没有证据支持这种想法的可行性.

java jvm jvm-hotspot

5
推荐指数
1
解决办法
1897
查看次数