背景
在maven中,工件可以声明依赖关系
<optional>true</optional>
Run Code Online (Sandbox Code Playgroud)
这意味着不需要依赖,但如果存在则可以使用.
模块系统的状态似乎指定模块只能读取它所需的模块.
问题
用例
我有一个框架,集成了应用程序可能使用或不使用的各种库.目前,该框架是一个单独的JAR,它反映了类路径以跳过缺少库的集成代码.
我想我们可以将它分成每个配置的单独模块,但这会导致JAR数量的组合爆炸,因为我们不仅需要为每个可选依赖项单独的JAR,而且对于大多数对都需要单独的JAR可选的依赖项......
Javadoc工具基于可访问性修饰符生成文档.默认情况下,它记录所有public和protected类,字段和方法.可以使用以下选项更改此设置:
-public
仅显示公共类和成员.-protected
仅显示受保护的公共类和成员.这是默认值.-package
仅显示包,受保护和公共类和成员.-private
显示所有类和成员.
Java 9引入了模块的概念,项目Jigsaw将其应用于现有的JDK.一谈马克莱因霍尔德(在一系列有关模块会谈3日)显示了如何public修改目前已拥有不同级别的可访问的,这取决于模块(通过可见性exports):
- 公开给大家
- 公开但仅限于特定模块
- 仅在模块内公开
由于现在并非所有公共成员都可以访问,因此继续使用相同的Javadoc生成方案将没有多大意义.只有那些暴露在"足够"水平的成员才应该被记录下来.
Javadoc模块是否可识别?除了上面的命令选项还有处理额外曝光层的命令选项吗?对于仅暴露给特定模块的公共成员,Javadoc是否列出了这些,如
public <module1, module2> static void getDefaultThing()
Run Code Online (Sandbox Code Playgroud)
?
我是JPMS的初学者,无法理解它的活力.例如,在当前的JVM实例中moduleA.jar正在运行.moduleA只需要java.base模块.现在,我想要
moduleB.jar需要java.sql模块和moduleC.jarmoduleBmoduleB,java.sql,moduleC从JVM并释放所有资源.可以在Java 9模块系统中完成吗?
当我编译一个依赖于我之前编译的其他模块的模块时,我必须指定该--module-path <directory>选项.这使我依赖的模块可见.
但与此同时,我还想让一些非模块化的Jar文件可见.但是,如果不使它们成为自动模块并且只是在--class-path some.jar旁边指定--module-path <directory>,那么javac似乎忽略了claspath并抛出"package yyy not found"和其他"未找到"错误.
我可以理解,使用--class-path和--module-path在同一个(编译)时间是非法的,但javac并没有以任何方式警告我.
我正在尝试从生成的源创建一个bean wsdl2java。
每次我尝试运行Spring Boot应用程序时,都会出现以下错误:
造成原因:java.lang.ClassCastException:org.apache.cxf.endpoint.ClientImpl类无法转换为com.xignite.services.XigniteCurrenciesSoap类(org.apache.cxf.endpoint.ClientImpl和com.xignite.services.XigniteCurrenciesSoap是在加载程序“ app”的未命名模块中)
我不确定我到底如何将生成的源作为模块包含在主Spring Boot应用程序中。
我的目录结构是:
??? build
? ??? generatedsources
? ??? src
? ??? main
? ??? java
? ??? com
? ??? xignite
? ??? services
?
??? src
??? main
??? java
? ??? io
? ??? mateo
? ??? stackoverflow
? ??? soapconsumption
??? resources
??? wsdls
Run Code Online (Sandbox Code Playgroud)
相关系统信息:
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
Run Code Online (Sandbox Code Playgroud)
我今天才注意到Math.fma(a, b, c)Java 9 的存在,它计算a*b + c
(for double和floatvalues).
返回三个参数的融合乘法加法; 也就是说,返回与第三个参数相加的前两个参数的精确乘积,然后将其舍入一次到最近的float.使用舍入到最近的偶数舍入模式完成舍入.相反,如果a*b + c被评估为常规浮点表达式,则涉及两个舍入误差,第一个用于乘法运算,第二个用于加法运算.
因此看起来它通过进行1舍入而不是2来提高准确性.这是正确的吗?那是有条件的CPU的能力,或者我们可以指望的是始终?
我猜它可能是使用特殊的CPU指令实现的.是这样的吗?如果是这样,我们还可以期待性能优势吗?我有兴趣了解当前平台/ CPU的实际好处,以及假设的未来收益.
编辑(试图让它变得不那么宽泛):我不是在寻找非常详细的答案:是/否对于纠正/确认我的理解的几个项目,加上一些指示,对我来说就足以标记答案了被接受了.我对准确性和性能方面都非常感兴趣,我认为它们在一起......
我有以下代码:
StringBuilder str = new StringBuilder("foo");
for(Field f : fields){
str.append("|" + f);
}
str.append("|" + bar);
String result = str.toString();
Run Code Online (Sandbox Code Playgroud)
我知道编译器会优化字符串连接"|" + f并用StringBuilder替换它.但是,是否会创建一个新的StringBuilder,或者现有的str将在Java 8中使用?Java 9怎么样?
Java EE 7应用程序服务器,特别是Servlet 3.1容器应该允许我们部署包含Web应用程序的WAR文件.WAR文件本质上是一个带有部署描述符(web.xml)和其他几个元素的JAR .
另一方面,Java 9引入了模块化JAR文件的概念,即带有模块descriptor(module-info.class)的JAR,它根据项目Jigsaw制作模块.
那么,WAR文件是否也包含模块描述符并制作"模块化WAR文件"?
是否已有应用程序服务器能够接受"模块化WAR文件"的部署?
一般来说,Java 9模块化方面的servlet容器和WAR文件的未来是什么?
sdk-tools-darwin-4333796 (26.1.1)在运行时使用Java 9 sdkmanager抛出:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 5 more
Run Code Online (Sandbox Code Playgroud) 如何先分组,然后使用Java流应用过滤?
示例:考虑此类Employee:我希望按部门分组,其中包含薪水大于2000的员工列表.
public class Employee {
private String department;
private Integer salary;
private String name;
//getter and setter
public Employee(String department, Integer salary, String name) {
this.department = department;
this.salary = salary;
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我如何做到这一点
List<Employee> list = new ArrayList<>();
list.add(new Employee("A", 5000, "A1"));
list.add(new Employee("B", 1000, "B1"));
list.add(new Employee("C", 6000, "C1"));
list.add(new Employee("C", 7000, "C2"));
Map<String, List<Employee>> collect = list.stream()
.filter(e -> e.getSalary() > 2000)
.collect(Collectors.groupingBy(Employee::getDepartment));
Run Code Online (Sandbox Code Playgroud)
产量
{A=[Employee [department=A, salary=5000, name=A1]],
C=[Employee [department=C, …Run Code Online (Sandbox Code Playgroud) java ×10
java-9 ×10
java-8 ×2
java-module ×2
java-platform-module-system ×2
android ×1
classpath ×1
collectors ×1
java-stream ×1
javadoc ×1
module-path ×1
performance ×1
servlets ×1
spring-boot ×1